matlab - 求解和绘制分段 ODE
问题描述
我有一个函数dφ/dt = γ - F(φ)
(其中F(φ)
- a 是2π
周期函数)和函数图F(φ)
。
我需要创建一个程序,为( , , , , , ) 和φ(t)
的不同值输出 6 个图。γ
γ = 0.1
0.5
0.95
1.05
2
5
t∈[0,100]
这是F(φ)
函数的定义:
-φ/a - π/a, if φ ∈ [-π, -π + a]
-1, if φ ∈ [-π + a, - a]
F(φ) = φ/a, if φ ∈ [- a, a]
1, if φ ∈ [a, π - a]
-φ/a + π/a, if φ ∈ [π - a, π]
^ F(φ)
|
|1 ______
| /| \
| / | \
| / | \ φ
__-π_______-a____|/___|________\π____>
\ | /|0 a
\ | / |
\ | / |
\ |/ |
¯¯¯¯¯¯ |-1
我的问题是我不知道ode45
在边界和初始条件方面要给出什么输入。我所知道的是,进化 φ(t)
必须是连续的。
这是以下情况的代码γ = 0.1
:
hold on;
df1dt = @(t,f1) 0.1 - f1 - 3.14;
df2dt = @(t,f2)- 1;
df3dt = @(t,f3) 0.1 + f3;
df4dt = @(t,f4)+1;
df5dt = @(t,f5) 0.1 - f5 + 3.14;
[T1,Y1] = ode45(df1dt, ...);
[T2,Y2] = ode45(df2dt, ...);
[T3,Y3] = ode45(df3dt, ...);
[T4,Y4] = ode45(df4dt, ...);
[T5,Y5] = ode45(df5dt, ...);
plot(T1,Y1);
plot(T2,Y2);
plot(T3,Y3);
plot(T4,Y4);
plot(T5,Y5);
hold off;
title('\gamma = 0.1')
解决方案
让我们首先定义F(φ,a)
:
function out = F(p, a)
phi = mod(p,2*pi);
out = (0 <= phi & phi < a ).*(phi/a) ...
+ (a <= phi & phi < pi-a ).*(1) ...
+ (pi-a <= phi & phi < pi+a ).*(-phi/a + pi/a) ...
+ (pi+a <= phi & phi < 2*pi-a).*(-1) ...
+ (2*pi-a <= phi & phi < 2*pi ).*(phi/a - 2*pi/a);
end
使用绘图代码:
x = linspace(-3*pi, 3*pi, 200);
a = pi/6;
figure(); plot(x,F(x, a));
xlim([-3*pi,3*pi]);
xticks(-3*pi:pi:3*pi);
xticklabels((-3:3)+ "\pi");
grid on; grid minor
ax = gca;
ax.XAxis.MinorTick = 'on';
ax.XAxis.MinorTickValues = ax.XAxis.Limits(1):pi/6:ax.XAxis.Limits(2);
从那里你不再需要打扰范围,只需调用ode45
:
% Preparations:
a = pi/6;
g = [0.1, 0.5, 0.95, 1.05, 2, 5]; % γ
phi0 = 0; % you need to specify the correct initial condition (!)
tStart = 0;
tEnd = 100;
% Calling the solver:
[t, phi] = arrayfun(@(x)ode45(@(t,p)x-F(p,a), [tStart, tEnd], phi0), g, 'UniformOutput', false);
% Plotting:
plotData = [t; phi];
figure(); plot(plotData{:});
legend("γ=" + g, 'Location', 'northwest');
导致:
推荐阅读
- c++ - 为什么 std::pair 对 const 引用和转发引用参数都有两个不同的构造函数?
- ios - ITMS-90809 将我的应用程序上传到应用商店连接时出错
- python - 对于循环不适用于 pandas.read_csv
- django - 如何在 Django 中进行嵌套循环
- python - Matplotlib - Python- GetDist 工具 - 通过调用两次 plot 函数重叠 2 个三角形图(三图):两者之间的可见优先级问题
- python - 查找洗牌的列索引
- javascript - 将奇怪的 JSON 响应转换为简单对象数组
- swift - 如何仅使用 SwiftUI 从@main App 访问 NSWindow?
- sql - sql 触发器函数 - 错误“返回多于一行”
- python - numpy 性能:在 numpy 中对可变相同大小的 ndarray 进行自定义元素操作