编写和绘制另一个函数的函数(MATLAB)

szqfcxe2  于 2023-11-21  发布在  Matlab
关注(0)|答案(2)|浏览(282)

我是一个全新的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));

字符串
我试着自己做这件事,但由于我对语言的不熟悉,我遇到了很多困难。我的目标(暂时)是使用函数函数在网格上绘制dx/dt和dy/dt,但在我接近这一点之前,我得到了太多的错误。有什么正确的语法建议吗?
谢谢你,谢谢
我试着重写函数,但得到了一些错误;最常见的是我被告知“operation * does not work with function_handle”,“没有足够的输入参数”等等。

dphi5xsq

dphi5xsq1#

首先,注意矩阵乘积*和元素乘.*之间的区别。如果两个操作数是标量(单个值),它们是相同的,但是对于矩阵输入,它们做的事情非常不同。因为你在矩阵txy上操作,你应该更新你的函数:

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);

字符串
每次*^/的两个操作数都是向量或矩阵时,您都希望使用逐元素运算符(.*.^./)。
我还分离出了dxdtdydt,因为表示整个x和y值数组的向量输出很复杂。
接下来,在调用d时,必须传入计算的txy。此外,由于我们不想绘制3D矢量图,因此我们将选择单个t,而不是它们的数组(如果您更喜欢绘制3D图,则应在meshgrid调用中包含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的任何变化?)

wixjitnu

wixjitnu2#

有两件事你应该知道:
1.请使用元素操作,例如.*.^,而不是矩阵或向量操作,例如*^;
1.应将d解叠加为两个单独的偏导数,即dxdtdydt

代码

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);

字符串

相关问题