无法在Matlab中使用quiver绘制向量场
我对Matlab很陌生,所以如果我犯了一些明显的错误,我很抱歉,但我有一个二阶常微分方程,我正试图绘制向量场。我已经查看了这个站点上的各种资源、MATLAB文档和MATLAB论坛,但是我仍然有问题 我曾尝试使用无法在Matlab中使用quiver绘制向量场,matlab,plot,ode,Matlab,Plot,Ode,我对Matlab很陌生,所以如果我犯了一些明显的错误,我很抱歉,但我有一个二阶常微分方程,我正试图绘制向量场。我已经查看了这个站点上的各种资源、MATLAB文档和MATLAB论坛,但是我仍然有问题 我曾尝试使用ode45函数来解决ODE问题,这给了我一个可以绘制的单一解决方案。我正在使用函数odeToVectorField将我的ODE转换为一阶ODE系统。我有一种感觉,这是阻止我正确地做我想要的事情的原因,因为它给了我一组符号方程,我很难在网格上计算它们 以下是我目前的代码: % Setup o
ode45
函数来解决ODE问题,这给了我一个可以绘制的单一解决方案。我正在使用函数odeToVectorField
将我的ODE转换为一阶ODE系统。我有一种感觉,这是阻止我正确地做我想要的事情的原因,因为它给了我一组符号方程,我很难在网格上计算它们
以下是我目前的代码:
% Setup outside variables
clear
mu = 0.75; % resistance variable
l = 1; % length of pendulum
g = 9.81; % gravity
% Next we setup the domains of the vector space.
xdom = linspace(-pi,pi,51); % define the X axis space
ydom = linspace(-pi,pi,51); % define the Y axis space
[X,Y] = meshgrid(xdom,ydom); % create a meshgrid for the vector field
% Define the system of ODEs
syms y(t)
eqn = diff(y,t,2) == - mu.*diff(y,t,1) - (g/l).*sin(diff(y,t,0));
U = odeToVectorField(eqn) % this is the part where I think I am doing wrong
Uf = matlabFunction(U(1), 'vars',{'t','Y'}) % trying to set a function handle for the first ODE
Vf = matlabFunction(U(2), 'vars',{'t','Y'}) % trying to set a function handle for the second ODE
% Now we plot it
figure
quiver(X,Y,Uf(X,Y), Vf(X,Y))
这是我的输出的屏幕截图。我特意省略了一些分号,以帮助您想象我正在尝试做的事情
非常感谢您的帮助。
Uf=Y(2)
,它总是只返回一个数字。1x1矩阵。正如错误所说的,席的大小和XI的大小不太一样,但我认为你错了。输出不是一个向量场,无法用quiver绘制。如果您查看odeToVectorField
文档,将有一个演示如何将其与matlabFunction
和plot一起使用odeToVectorField
应该是“将微分方程的阶数降到一阶”,而不是生成向量场!感谢@AnderBiguri的评论。然后,我应该如何访问一阶ODE系统的每个组件?通过改变ODEU=Y的声明方式,我成功地获得了我想要的结果代码>和V=-mu.*Y-(g/l)。*sin(X)
是否可以让Matlab使用odeToVectorField为我生成这些方程?Uf=Y(2)
,它总是只返回一个数字。1x1矩阵。正如错误所说的,席的大小和XI的大小不太一样,但我认为你错了。输出不是一个向量场,无法用quiver绘制。如果您查看odeToVectorField
文档,将有一个演示如何将其与matlabFunction
和plot一起使用odeToVectorField
应该是“将微分方程的阶数降到一阶”,而不是生成向量场!感谢@AnderBiguri的评论。然后,我应该如何访问一阶ODE系统的每个组件?通过改变ODEU=Y的声明方式,我成功地获得了我想要的结果代码>和V=-mu.*Y-(g/l)。*sin(X)代码>是否可以让Matlab使用odeToVectorField为我生成这些方程?