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

问题描述 投票:0回答:2

我对 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”、“没有足够的输入参数”等等。

matlab matlab-figure
2个回答
0
投票

首先,注意矩阵乘积

*
和逐元素乘法
.*
之间的区别。如果两个操作数是标量(单个值),它们是相同的,但对于矩阵输入执行的操作却截然不同。由于您正在操作矩阵
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
有任何变化?)


0
投票

您应该注意两件事:

  1. 请使用逐元素运算,例如
    .*
    .^
    ,而不是矩阵或向量运算,例如
    *
    ^
  2. 应将
    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);
© www.soinside.com 2019 - 2024. All rights reserved.