MATLAB解决方案曲线不使用quiver和dsolve拟合斜率场

时间:2018-06-15 05:04:49

标签: matlab differential-equations graphing

给出一阶微分方程......

dy / dx = 0.01y(1 - y)(y - 1/2)

我正在尝试创建一个斜率场并显示一些特定的解决方案曲线,但由于某种原因,曲线看起来并不完美地适合矢量。

这是输出: solution curves 如果你看两条中间曲线,它们的斜率似乎不符合向量。这是情节本身的神器还是我做错了什么?

我花了一些时间让坡道显示得很好,也许解决方案曲线不适合的原因是因为点之间的间距,但我不确定。

以下是代码:

    [T Y] = meshgrid(-200:10:200, -2:0.1:2);
    dY = 0.01.*Y.*(1-Y).*(Y-(0.5));
    dT = ones(size(dY));
    L = sqrt(dT.^2 + dY.^2);
    figure
    quiver(T, Y, dT./(L), dY./L, .6, 'AutoScale', 'off',                         'ShowArrowHead', 'off');
    axis tight
    hold on
    grid on
    axis([-200 200 -2 2])

    syms x y
    de = 'Dy = 0.01*y*(1-y)*(y-(0.5))';

    y1 = dsolve(de, 'y(0) = -1', 'x');
    y1 = expand(y1);

    y2 = dsolve(de, 'y(0) = 1/4', 'x');
    y2 = expand(y2);

    y3 = dsolve(de, 'y(0) = 3/4', 'x');
    y3 = expand(y3);

    y4 = dsolve(de, 'y(0) = 2', 'x');
    y4 = expand(y4);

    for fxn = [y1 y2 y3 y4]
        fplot(fxn, [-200 200], 'LineWidth', 2)
        hold on
    end

1 个答案:

答案 0 :(得分:0)

Quiver在矩形网格(https://www.mathworks.com/help/matlab/ref/quiver.html)上绘制有明确定义的原点。而不是说具有不均匀虚线图的大量曲线,其中破折号将匹配该点处的值。

在中心,线条几乎是水平的。因此,看起来您的紫色和橙色曲线的低斜率与箭头相交并且不遵循假定的线条。 如果在曲线附近放大,您将看到差异,并且两条曲线实际上都正确地遵循斜率。

不幸的是,您无法通过更加密集的网格网格来解决此问题。假设您将点数增加10倍TY - 所有图形都将是蓝色海洋,但在紫色线附近进行缩放仍会显示同样的问题。

现在,你可以做的是在中央区域手动“类似箭袋”的情节,比如Y上的0到1.选择起始Y和X点,也许与你现在相同。绘制对应于相同箭头的第一行。现在,不要将后续Y点保持为其他向量的相同,而是计算如果该行将继续它们将必须在哪里 - Ynext = Y+dY*(T(i)-T(i-1))。计算下一轮点的修正Y点的相同dY,dT和L,并重复直到达到界限结束。

说出这段代码(我仍然需要修改长度并修正偏移量,但总体思路如下):

Ycentral = 0:0.1:1;
Ynext = Ycentral;
numX = length(x);
for i = 1 : numX   
    [T2, Y2] = meshgrid(x(i), Ynext);
    dY = 0.01 * Ynext .* (1-Ynext).*(Ynext - 0.5);
    dT = ones(size(dY));
    L = sqrt(dT.^2 + dY.^2);    

    quiver(T2', Y2', dT./(L), dY./L, .6, 'AutoScale', 'off', 'ShowArrowHead', 'off');

    Ynext = Ynext + dY;
end