使用ode求解器求解3个微分方程(Lorenz方程)的非线性系统:Matlab中的ode23s

时间:2014-06-19 12:37:01

标签: matlab matlab-guide matlab-compiler nonlinear-optimization

我正在尝试使用ode求解器解决3个不同的方程(Lorenz方程):在Matlab中使用ode23s。以下是3个洛伦兹方程式:

dc / dt = alpha * I *(1-c)+ c *( - k_f - k_d - k_n * s - k_p *(1-q))

ds / dt = lambda_b * c * P_C *(1-s) - lambda_r *(1-q)* s

dq / dt =(1-q)* k_p * c *(P_C / P_Q) - gamma * q

我使用了ode求解器并创建了两个M文件ode.m和lorenz.m

=>这是我的两个Matlab M文件。这是我的第一个M文件:ode.m,我跑来绘制图表。

  format bank
  close all; 
  clear all; 
  clc; 

  %time interval
  ti=0; 
  tf=140; 
  tspan=[ti tf]; 

  x0=[0.25 0.02 0.98]; %initial vectors

  %time interval of [0 2] with initial condition vector [0.25 0.02 0.02] at time 0.
  options= odeset('RelTol',1e-4, 'AbsTol',[1e-4 1e-4 1e-4]);
  [t,x]= ode23s('lorenz',tspan,x0,options); 

  %Plotting the graphs:
  figure 
  subplot(3,1,1), plot(t,x(:,1),'r'),grid on; 
  title('Lorenz Equations'),ylabel('c'); 

  subplot(3,1,2), plot(t,x(:,2),'b'),grid on; 
  ylabel('s'); 

  subplot(3,1,3), plot(t,x(:,3),'g'),grid on; 
  ylabel('q');xlabel('t') 

这是我的第二个M文件,它是lorenz.m

  % Creating the MATLAB M-file containing the Lorenz equations.

  function xprime= lorenz(t,x)

   %values of parameters
    I=1200;
    k_f= 6.7*10.^7;
    k_d= 6.03*10.^8; 
    k_n=2.92*10.^9; 
    k_p=4.94*10.^9;
    lambda_b= 0.0087;
    lambda_r =835; 
    gamma =2.74; 
    alpha =1.14437*10.^-3;
    P_C= 3 * 10.^(11);
    P_Q= 2.87 * 10.^(10);    

 % initial conditions
  c=x(1);
  s=x(2);
  q=x(3);

  %Non-linear differential equations.
  % dc/dt= alpha*I*(1-c) + c*(- k_f - k_d - k_n * s - k_p*(1-q))
  % ds/dt = lambda_b * c* P_C *(1-s)- lambda_r *(1-q)*s
  % dq/dt = (1-q)* k_p * c *(P_C / P_Q)- gamma * q

  xprime=[ alpha*I*(1-c) + c*(- k_f - k_d - k_n * s - k_p*(1-q)); lambda_b *(1-s)* c* P_C  - lambda_r *(1-q)*s; (1-q)*k_p * c *(P_C / P_Q)- gamma * q];

请帮帮我,两个M文件代码都正常工作,但我想在lorenz.m文件中使用函数句柄(@lorenz),因为Lorenz不是很好描述这个问题。而且,当我运行ode.m文件时,绘图的值非常小,但是当我运行lorenz.m文件时,c,s,q的值真的很大。我想在某处得到s和q的值在0到1之间.c的值应该是3.5 X10 ^ 11的大数字。我不知道发生了什么事?

1 个答案:

答案 0 :(得分:1)

据我所见,你的功能不正确。这一行:

xprime=[ alpha*I*(1-c) + c*(- k_f - k_d - k_n * s - k_p*(1-q)); lambda_b * c* P_C - lambda_r *(1-q)*s;   k_p * c *(P_C / P_Q)- gamma * q];

应该是:

xprime=[ alpha*I*(1-x(1)) + x(1)*(- k_f - k_d - k_n * x(2) - k_p*(1-x(3))); lambda_b * x(1)* P_C - lambda_r *(1-x(3))*x(2);   k_p * x(1) *(P_C / P_Q)- gamma * x(3)];

然后您可以在函数中删除这些行(初始条件通过调用ode15s传递):

%initial vectors
  c=0.25; 
  s=0.02;
  q=0.02;