如何在matlab中绘制函数图?

How to graph the function in matlab?

我有以下 2n*π-周期函数 F(x) = sin(x/n),我需要绘制从 02pi 的线段上的 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;