matlab - MATLAB 求解曲线不适合使用 quiver 和 dsolve 的斜率场
问题描述
给定一个一阶微分方程...
dy/dx = 0.01y(1 - y)(y - 1/2)
我正在尝试创建一个斜率场并显示一些特定的解决方案曲线,但由于某种原因,这些曲线似乎不能完美地拟合向量。
这是输出: 如果您查看两条中间曲线,它们的斜率似乎不遵循向量。这是情节本身的产物还是我做错了什么?
我花了一些时间让斜率场很好地显示出来,也许解曲线不适合的原因是因为点之间的间距,但我不确定。
这是代码:
[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
解决方案
Quiver
在矩形网格 ( https://www.mathworks.com/help/matlab/ref/quiver.html )上绘制有明确定义的原点。而不是说大量带有不均匀虚线图的曲线,其中虚线将匹配该点的值。
在中心,线条几乎是水平的。因此,看起来好像你的紫色和橙色曲线的低斜率与颤动相交并且不遵循假设的线。如果在曲线附近放大,您会看到差异,并且两条曲线实际上都正确地遵循斜率。
不幸的是,您无法通过使用 quiver 的更密集的网格来解决此问题。假设您将 10 倍的点添加到T
和Y
- 所有图形将是一片蓝色的海洋,但在紫色线附近缩放仍然会显示同样的问题。
现在,您可以做的是在中心区域手动绘制“类似颤抖”的图,例如在 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
推荐阅读
- python - 查找数据框中不包含某些值的所有值
- python - 使用 python 执行“import mysql.connector”时出现问题(MAC OS Mojave 10.14.6)
- css - CSS中的动态绘制背景
- apache-spark - How do I filter a pyspark dataframe in a loop and append to a dataframe?
- javascript - 在外部 JS 文件中映射和渲染 axios 响应数据
- visual-studio-code - 如何删除 VSCode 上的存储库?
- amazon-web-services - Amazon EventBridge PutEvents 限制
- android-textinputlayout - 如何更改 TextInputEditText 中可绘制的位置?
- java - Android 在 onDestroy 中发送 HTTP Post
- c - 为什么在c中将指针转换为双指针?