我对 MATLAB 完全陌生,并被分配了一个小项目来绘制一些导数和轨迹。我得到:
f(t,x) = 0.02sin(2πt)(x^2 - 2x) + x;
dx/dt = -πsin(π*f(t,x))cos(πy);
dy/dt = πcos(πf(t,x))sin(πy)(∂f/∂x)
现有代码:
f = @(t,x,y) (0.02*sin(2*pi*t)*(x^2 - 2*x) + x);
dfdx = @(t,x,y) (0.02*sin(2*pi*t)*(2*x - 2) + 1);
d = @(t,x,y) [-pi*sin(pi*f(t,x,y))*cos(pi*y); pi*cos(pi*f(t,x,y))*sin(pi*y)*dfdx(t,x,y)];
t = linspace(0,4,100);
figure
[x,y] = meshgrid(0:.1:2,0:0.1:1);
quiver(x,y,d(1),d(2));
我尝试自己完成这项工作,但由于我不熟悉这门语言,我遇到了很多困难。我的目标(暂时)是使用 quiver 函数在网格上绘制 dx/dt 和 dy/dt ,但在接近该点之前我遇到了太多错误。对于使这项工作有效的正确语法有什么建议吗?
谢谢!
我尝试重写这些函数,但遇到了一些错误;最常见的是,我被告知“操作 * 不适用于 function_handle”、“没有足够的输入参数”等等。
首先,注意矩阵乘积
*
和逐元素乘法 .*
之间的区别。如果两个操作数是标量(单个值),它们是相同的,但对于矩阵输入执行的操作却截然不同。由于您正在操作矩阵 t
、x
和 y
,您应该更新您的函数:
f = @(t,x,y) (0.02*sin(2*pi*t).*(x.^2 - 2*x) + x);
dfdx = @(t,x,y) (0.02*sin(2*pi*t).*(2*x - 2) + 1);
dxdt = @(t,x,y) -pi*sin(pi*f(t,x,y)).*cos(pi*y);
dydt = @(t,x,y) pi*cos(pi*f(t,x,y)).*sin(pi*y).*dfdx(t,x,y);
每次
*
或 ^
或 /
的两个操作数都是向量或矩阵时,您需要使用逐元素运算符(.*
、.^
、./
)。
我还分离出了
dxdt
和 dydt
,因为表示整个 x 和 y 值数组的向量输出很复杂。
接下来,调用
d
时,必须传入你计算出来的t
、x
和y
。另外,由于我们不想绘制 3D 矢量图,因此我们将选择单个 t
,而不是它们的数组(我们还必须重写函数以接受向量 t):
t = 0;
[x,y] = meshgrid(0:.1:2,0:0.1:1);
u = dxdt(t,x,y);
v = dydt(t,x,y);
现在我们应该能够绘制:
quiver(x,y,u,v);
对于多个
t
值,您可以对绘图进行迭代和动画处理:
for t = linspace(0,4,100)
u = dxdt(t,x,y);
v = dydt(t,x,y);
quiver(x,y,u,v);
pause(0.5)
end
(虽然不幸的是我没有看到
t
有任何变化?)
您应该注意两件事:
.*
和 .^
,而不是矩阵或向量运算,例如 *
和 ^
;d
分解为两个单独的偏导数,即 dxdt
和 dydt
f = @(t,x,y) (0.02.*sin(2.*pi.*t).*(x.^2 - 2.*x) + x);
dfdx = @(t,x,y) (0.02.*sin(2.*pi.*t).*(2.*x - 2) + 1);
dxdt = @(t,x,y) -pi.*sin(pi.*f(t,x,y)).*cos(pi.*y);
dydt = @(t,x,y) pi.*cos(pi.*f(t,x,y)).*sin(pi.*y).*dfdx(t,x,y);
[x,y] = meshgrid(0:.1:2,0:0.1:1);
t = linspace(0, 4, 100);
arrayfun(@(p) {figure;quiver(x,y,dxdt(p,x,y),dydt(p,x,y))}, t, UniformOutput=false);