如何用箭袋绘制我的微分方程?

How to plot my differential equation with quiver?

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

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

我得到这个错误:

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

这可能是我看不到的简单问题,但我才刚刚开始使用 Matlab,但我找不到正确的方法来完成我的任务。请帮助我...

编辑

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

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

并且之前的错误已经修复。然而,我的主要目标,绘制速度矢量还没有完成,因为我得到了这样的图表:

目前无法检查,但我想你想在那行中逐个元素划分。你在除法上漏了一个点,试试

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

我在我的车站仔细看了看。 Pablo 提到的零除法强制 infZ 中,所以 quiver 在缩放向量时会感到困惑(可以理解)并且只是不显示它们。试试这个(删除颂歌部分):

[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

我在这里做了 3 件事:

  1. 添加了行 Z(isinf(Z)) = nan; 强制无限值被 quiver
  2. 基本上忽略
  3. 向轮廓函数添加了参数 30, 'k' 以显示 30 条线,并使它们变黑(更明显一点)
  4. 向 quiver 函数添加了参数 6。这会覆盖向量的自动长度缩放。

您需要使用 contourquiver 函数中的参数来使您的图形显示如您所愿。

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