近日帮别人用MATLAB画图,记录一下。 MATLAB版本为最新的R2023a。毕竟学校买了正版,不用白不用。
使用两个向量生成meshgrid
1 2 3 4 5
| [gamma_arr, nh_arr] = meshgrid( ... 0.077562 : 4E-7 : 0.0775699999, ... 3.8794E19 : 4.5E14 : 3.88029999E19 ... );
|
假设meshgrid的参数中两个向量长度为N,则运行结果是得到两个NxN的矩阵X和Y,例子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| >> [X, Y] = meshgrid(1:4, 5:8)
X =
1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
Y =
5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8
|
这样一来,有 表示二维直角坐标系上的一个点。
计算因变量的值
1 2 3 4 5 6 7 8 9 10 11 12 13
| F_mat = zeros(length(gamma_arr), length(nh_arr));
for i = 1 : length(gamma_arr) parfor j = 1 : length(nh_arr) gamma = gamma_arr(i, j); nh = nh_arr(i, j); F_mat(i, j) = F(gamma, nh, jnkbt, N, NC); end end
|
这里我对F_mat
的计算方法不是很满意。虽然可以用parfor并行计算,但是还是想用类似于闭包的东西写得简洁一些(并且相信MATLAB做足了优化,不需要我手动并行了)。
3D作图
1 2
| % surf 可以作出一个平面 surf(gamma_arr, nh_arr, F_mat)
|
自此图就画好了。
附录:一些常见技巧
定义一个函数
1 2 3
| function S = SUM(a, b) S = a + b; end
|
其中S
是函数的返回值,当函数执行完毕,S的值就是函数的返回值。实际上,函数名称和函数返回变量可以重名,例如可以把第一行修改为function F = F(a, b)
。
求解方程的数值解
1 2 3 4 5 6 7 8
| syms x;
eq = x*x + 2x - 3;
res = vpasolve(eq == 0, x); res = vpasolve(eq == 0, x, 100);
|
首先需要定义若干需要求解的符号变量(用于解方程的符号而不是真正的编程变量),然后调用vpasolve
即可。顺便一提solve
可以求解析解,但是一旦求不出来,就会先报一个warning然后fallback到vpasolve
求解。
判断一个数是否为实数
MATLAB提供了一个函数isreal
用于判断一个数是实数或者复数。
1 2 3 4 5
| r = 1; nr = 1 + 3i;
isreal(r); isreal(nr);
|
文档指出,虚部为0的数会被认为是复数:
1 2
| c = complex(1) isreal(c)
|
vpasolve
的返回值可能是虚部为0的复数,因此需要改用虚部是否为0判断是否为实数:
1 2
| c = complex(10) imag(c) != 0
|
Fin.