Matlab 求解一个6常微分方程变参数闭系统

Matlab 求解一个6常微分方程变参数闭系统,matlab,ode,Matlab,Ode,我有一个6颂歌的系统 我试图解决的是,对于它的一个参数,参数“p”的几个不同值,在积分处使用for循环来解决它 然而,我已经设法使用ode45来完成这项工作, 使用非内置积分器,似乎我犯了一个错误,并且我没有返回相同的值或图形 如果您对我的代码有任何错误的反馈,我将不胜感激 使用ODE45 p = -100:+1:350; time = 0:.05:3; initial = [0 0 0 0 0 0]; x = NaN(length(time),length(initial),length(p)

我有一个6颂歌的系统

我试图解决的是,对于它的一个参数,参数“p”的几个不同值,在积分处使用for循环来解决它

然而,我已经设法使用ode45来完成这项工作,
使用非内置积分器,似乎我犯了一个错误,并且我没有返回相同的值或图形

如果您对我的代码有任何错误的反馈,我将不胜感激

使用ODE45

p = -100:+1:350;
time = 0:.05:3;
initial = [0 0 0 0 0 0];
x = NaN(length(time),length(initial),length(p));

for i=1:length(p)

    [t,x(:,:,i)] = ode45(@ode,time,initial,[],p(i));

end
figure(1)
plot3(squeeze(x(:,1,:)),squeeze(x(:,2,:)),squeeze(x(:,3,:)))

function dx = ode(~,x,p)
    bla bla
end
使用非内置积分器

figure
hold all

for p = -100:+1:350
    inicond = [0 0 0 0 0 0];
    dt = 0.01;
    time = 0:dt:10;

    [y] = integrator(@ode,inicond,time,dt,p);
    x1 = y(:,1);
    x2 = y(:,2);
    x3 = y(:,3);
    figure(1)
    plot3(x1,x2,x3)
    axis equal
    legend('-DynamicLegend')
end

function [y] = integrator(ode,inicond,time,dt,p)

    y = NaN(length(time),length(inicond));
    y(1,:) = inicond;

  for j=2:length(time)
      k1 = dt*ode(y(j-1,:),p);
      k2 = dt*ode(y(j-1,:)+k1/2,p);
      k3 = dt*ode(y(j-1,:)+k2/2,p);
      k4 = dt*ode(y(j-1,:)+k3,p);
      y(j,:) = y(j-1,:) + k1/6+k2/3+k3/3+k4/6;
  end   
end


function [dydt] = ode(y,p)
    bla bla
end
使用非内置函数来求解多个“ε”值的范德波尔:这是可行的,而对于前一个函数则不行

    figure
    hold all
for epsilon = 0:.2:5
    inicond = [0.2 0.8];        
    dt = 0.1;%timestep for integration
    time = 0:dt:100;

    [x] = integrator(@VanDerPol,inicond,time,dt,epsilon);

    xdot = x(:,2);
    x = x(:,1);
    figure(1)
    plot(x,xdot,'DisplayName',sprintf('epsilon = %1.0f',epsilon))
    figure(2)
    plot3(time, x,xdot)
    axis equal
    legend('-DynamicLegend')
end

function [x] = integrator(VanDerPol,inicond,time,dt,epsilon)

x = NaN(length(time),length(inicond));
x(1,:) = inicond;
%%% ACTUAL CALL OF INTEGRATOR  %%%%%%%%%%%%%%   
    for j=2:length(time)
        k1 = dt*feval(VanDerPol,x(j-1,:),epsilon);
        k2 = dt*feval(VanDerPol,x(j-1,:)+k1/2,epsilon);
        k3 = dt*feval(VanDerPol,x(j-1,:)+k2/2,epsilon);
        k4 = dt*feval(VanDerPol,x(j-1,:)+k3,epsilon);
        x(j,:) = x(j-1,:) + k1/6+k2/3+k3/3+k4/6;
    end   
end


function [dxdt] = VanDerPol(x,epsilon)

dxdt=NaN(1,2);

dxdt(1,1) = x(:,2);
dxdt(1,2) = epsilon*(1 - x(:,1)^2)*x(:,2) - x(:,1);

end

我担心,使用第二种方法,所有重复的值可能无法正确存储,因此,积分后出现的矩阵值彼此之间几乎没有变化

在第二种方法中,您的解决方案是在
y
,但您绘制
(x1,x2,x3)
?你在干净的工作空间里试过这个吗?是的,我只是减去了很多行来节省空间。我现在已经用缺少的行编辑了它。我看不到方法resp中有任何错误。代码。你能进一步描述一下质量和数量上的错误吗?如果你对一些一维或二维的ODE系统比较这些方法,你会发现类似的错误吗?如果改变步长,会有区别吗?好问题:1。我计算了x1、x2、x3或y1、y2、y3,以便比较所有p值的这些矩阵的秩。在ODE45中,所有三个的排名都是60!它几乎是满级别的。对于有问题的积分器,秩最大为2!请注意,我使用完全相同的初始条件和参数2。我对一个“ε”变化的范德波尔尝试了完全相同的方法。结果是完美的积分!我将发布范德波尔代码,在数值矩阵的模糊情况下,toorank是一个相当迟钝的工具。如果您确实比较了SVD,并且前两个奇异值大大大于后两个奇异值,则这两种方法的结果在某种程度上仍然是一致的,这意味着矩阵由秩2矩阵很好地近似。