如何在matlab中绘制函数图?
How to graph the function in matlab?
我有以下 2n*π
-周期函数 F(x) = sin(x/n)
,我需要绘制从 0
到 2pi
的线段上的 dx/dt = γ - F(x)
。所以它应该看起来像 this。我试着用这种方式来做 matlab:
gamma = 1.01;
n=3;
[t,phi] = ode45(@(t,x)gamma-sin(x/n), [0,400], pi);
[t1,phi1] = ode45(@(t,x)gamma-sin(x/n), [112,400], 0);
[t2,phi2] = ode45(@(t,x)gamma-sin(x/n), [231,250], 0);
figure();
plot(t, phi, 'k', t1, phi1, 'k', t2, phi2, 'k');
ylim([0 2*pi]);
yticks([0 pi 2*pi]);
yticklabels(["0" "\pi" "2\pi"]);
grid on; grid minor;
title('\itsin(x/n)')
但我只得到了something like this。所以那里的台词没有转移,而是“重新开始”。这里有人知道怎么做吗?
我得到了一个类似于你的第一个草图的情节,并基于你在评论中的代码(将来,将这些添加到问题本身,使用格式将其标记为添加,然后在评论中引用它) 有变化
- 使用
pi
作为图中的初始点,
- 使用 ODE 求解器的选项直接和通过施加误差容限来限制步长
- 您的原始时间跨度大约涵盖 3 个时期,将其减少到
[0, 200]
以获得与绘图相同的特征。
gamma = 1.01; n=3;
opts = odeset('AbsTol',1e-6,'RelTol',1e-9,'MaxStep',0.1);
[t, phi] = ode45(@(t,x)gamma-sin(x/n), [0,200], pi, opts);
phi = mod(phi, 2*pi);
plot(t, phi, 'k');
ylim([0 2*pi]); yticks([0 pi 2*pi]); yticklabels(["0" "\pi" "2\pi"]);
grid on; grid minor;
title('\itsin(x/n)')
为了更详细,使用事件获取数值解上恰好穿过 2*pi
周期的点,然后使用它来分割解图(省略样式)
function [ res, term, dir ] = event(t,y)
y = mod(y+pi,2*pi)-pi;
res = [ y ];
dir = [1]; % only crossing upwards
term = [0]; % do not terminate
end%function
opts = odeset(opts,'Events',@(t,y)event(t,y));
sol = ode45(@(t,x)gamma-sin(x/n), [0,200], pi, opts);
tfs = [ sol.xe; sol.x(end) ]
N = length(tfs)
clf;
t0 = 0;
for i=1:N
tf = tfs(i);
t = linspace(t0+1e-2,tf-1e-2,150);
y = deval(sol,t); % octave: deval=@(res,t) interp1(res.x, res.y,t)
y = mod(y,2*pi);
plot(t, y);
hold on;
t0=tf;
end;
hold off;
我有以下 2n*π
-周期函数 F(x) = sin(x/n)
,我需要绘制从 0
到 2pi
的线段上的 dx/dt = γ - F(x)
。所以它应该看起来像 this。我试着用这种方式来做 matlab:
gamma = 1.01;
n=3;
[t,phi] = ode45(@(t,x)gamma-sin(x/n), [0,400], pi);
[t1,phi1] = ode45(@(t,x)gamma-sin(x/n), [112,400], 0);
[t2,phi2] = ode45(@(t,x)gamma-sin(x/n), [231,250], 0);
figure();
plot(t, phi, 'k', t1, phi1, 'k', t2, phi2, 'k');
ylim([0 2*pi]);
yticks([0 pi 2*pi]);
yticklabels(["0" "\pi" "2\pi"]);
grid on; grid minor;
title('\itsin(x/n)')
但我只得到了something like this。所以那里的台词没有转移,而是“重新开始”。这里有人知道怎么做吗?
我得到了一个类似于你的第一个草图的情节,并基于你在评论中的代码(将来,将这些添加到问题本身,使用格式将其标记为添加,然后在评论中引用它) 有变化
- 使用
pi
作为图中的初始点, - 使用 ODE 求解器的选项直接和通过施加误差容限来限制步长
- 您的原始时间跨度大约涵盖 3 个时期,将其减少到
[0, 200]
以获得与绘图相同的特征。
gamma = 1.01; n=3;
opts = odeset('AbsTol',1e-6,'RelTol',1e-9,'MaxStep',0.1);
[t, phi] = ode45(@(t,x)gamma-sin(x/n), [0,200], pi, opts);
phi = mod(phi, 2*pi);
plot(t, phi, 'k');
ylim([0 2*pi]); yticks([0 pi 2*pi]); yticklabels(["0" "\pi" "2\pi"]);
grid on; grid minor;
title('\itsin(x/n)')
为了更详细,使用事件获取数值解上恰好穿过 2*pi
周期的点,然后使用它来分割解图(省略样式)
function [ res, term, dir ] = event(t,y)
y = mod(y+pi,2*pi)-pi;
res = [ y ];
dir = [1]; % only crossing upwards
term = [0]; % do not terminate
end%function
opts = odeset(opts,'Events',@(t,y)event(t,y));
sol = ode45(@(t,x)gamma-sin(x/n), [0,200], pi, opts);
tfs = [ sol.xe; sol.x(end) ]
N = length(tfs)
clf;
t0 = 0;
for i=1:N
tf = tfs(i);
t = linspace(t0+1e-2,tf-1e-2,150);
y = deval(sol,t); % octave: deval=@(res,t) interp1(res.x, res.y,t)
y = mod(y,2*pi);
plot(t, y);
hold on;
t0=tf;
end;
hold off;