如何用颤动图绘制我的微分方程?

时间:2018-09-30 19:02:24

标签: matlab plot differential-equations

我想求解我的微分方程并绘制速度矢量,但是我遇到了一些麻烦。我尝试过:

<i class="wi wi-night-sleet"></i>

我得到这个错误:

syms y(x);
ode = (1+exp(x))*y*diff(y,x)-2*exp(x) == 0;
ySol = dsolve(ode)

[X,Y] = meshgrid(-2:.2:2);
Z = 2*exp(X)/((1+exp(X)).*Y);
[DX,DY] = gradient(Z,.2,.2);

figure
contour(X,Y,Z)
hold on
quiver(X,Y,DX,DY)
hold off

我可能看不到这很简单,但是我只是开始使用Matlab,而我却找不到合适的方法来完成任务。请帮助我...

编辑

按照bconrad的建议,我这样更改了Z函数:

Warning: Matrix is singular to working precision. 
Warning: Contour not rendered for non-finite ZData 

和以前的错误已得到修复。但是,绘制速度矢量的主要目标尚未实现,因为我得到了如下图: enter image description here

1 个答案:

答案 0 :(得分:3)

目前无法检查,但我认为您需要在该行中逐个元素进行划分。您在分区上缺少点,请尝试

Z = 2*exp(X)./((1+exp(X)).*Y);

我一次在车站仔细看了一下。 Pablo在inf中将Z强制归零,所以在缩放向量时(可理解的)颤抖变得混乱了,只是没有显示出来。尝试以下操作(移除ode部分):

[X,Y] = meshgrid(-2 : .2 : 2);
Z = 2 * exp(X) ./ ((1 + exp(X)) .* Y);
Z(isinf(Z)) = nan; % To avoid 0-division problems
[DX, DY] = gradient(Z, .2, .2);

figure
contour(X, Y, Z, 30, 'k')
hold on
quiver(X, Y, DX, DY, 6)
hold off

我在这里做了三件事:

  1. 添加了Z(isinf(Z)) = nan;行,迫使quiver会实质上忽略无限值
  2. 在轮廓函数中添加了参数30, 'k',以显示30条线,并使它们变黑(更加可见)
  3. 将参数6添加到了quiver函数。这将覆盖向量的自动长度缩放。

您将需要使用contourquiver函数中的参数来使图形显示为您想要的样子。

PS:我发现文件交换上有一个方便的arrow函数,可以在创建矢量场图时更好地控制它。请参见https://www.mathworks.com/matlabcentral/fileexchange/278-arrow-评分确实正确。