Matlab微分方程组

时间:2014-02-07 10:03:17

标签: matlab solver differential-equations

我这里有一个我不知道如何处理的程序,我之前编写的代码可以解决我的两个微分方程系统,它可以正常工作。

但是,我现在必须解决三个微分方程组:

  

d(alphai)/ dt = ui = k * alphai * f(tethai)

     

d(tethai)/ dt = alphai * f(tethai) - (tethai - tethaex)

     

d(tethaex)/ dt = sigma *(Sum(1.N)(tethai - tethaex)) - phi * tethaex

到目前为止,这是我的代码,但我收到了一些错误:

%Script for differential derivatives specifcation

   function dy = NRateDE(T,Y,p)
   %Extract parameters from P
   u0 = p(1);
   g = p(2);
   k = p(3);
   a = p(4);
   b = p(5);
   N = p(6);

   %Format output as a column vector
   dy = zeros(3,1);

   %Set differential equations
   dy(1) = (u0*exp(-g*T)) - (k*Y(1)*exp(Y(2)));
   dy(2) = Y(1)*exp(Y(2)) - (Y(2)) - Y(3);
A = Sum(Y,N);
dy(3) = (a .* A) - (b .* Y(3));
end

function A = Sum(Y,N)
    for i=1:N
        A = A + (Y(2) - Y(3));
    end
end

最后这里是主要功能:

%% Initialize the environment
close all;
clear all;
clc;

%%Define parameters and initial conditions
u0 = 0.12; g = 0; k = 0.09; N = 2; a = 0; b = 0.1; z = 0;A=0; %Parameters
MaxTime = 300;
T = 0:0.01:MaxTime; %integration time
Yinitial = 0; Yminitial = 0; %intial conditions

%%Solve and generate equations
%#Numerical approximation
    for z=1:N
        %Create random numbers to change the value of u0
        a1 = - 0.01;
        b1 = 0.01;
        r = (b1-a1).*rand(1) + a1;
        u0 = u0 +r; %value changes on each iteration
        [T,Y] = ode23s(@NRateDE,[T],[Yminitial Yinitial],[],[u0 g k a b N A]);
    end   
%#Analytical approximation
    tau = 0:0.2:MaxTime;              
    tetha = (u0*exp(-g*tau))/k;
    alpha = u0*exp(-g*tau).*exp(tetha);

当N = 2时,我应该得到两组[T,Y]的矩阵,但我不知道如何纠正代码。我对Matlab很新,所以请原谅任何愚蠢的错误哈哈'。

任何想法,提示?

提前感谢您的帮助!

编辑:我稍微改变了第一个功能,“RateDE”不是故意的。这里还有错误消息:

  

试图访问Y(3);因为数字(Y)= 2,所以索引越界。

     

NRateDE中的错误(第18行)   dy(2)= Y(1)* exp(Y(2)) - (Y(2)) - Y(3);

     

odearguments中的错误(第88行)   f0 = feval(ode,t0,y0,args {:}); %ODE15I将args {1}设置为yp0。

     

ode15s出错(第149行)   [neq,tspan,ntspan,next,t0,tfinal,tdir,y0,f0,odeArgs,odeFcn,...

     

RunRateNparticles出错(第20行)   [T,Y] = ode15s(@NRateDE,[T],[Yminitial Yinitial],[],[u0 g k a b N A]);


右键!

我理解错误消息并通过在Y上添加元素来纠正错误:

[T,Y] = ode23s(@NRateDE,[T],[Yminitial Yinitial Ylinitial],[],[u0 g k a b N A]);

但是,我仍然无法解决第一条消息上给出的三个微分方程组。

以下是当前的错误消息:

  

未定义的函数或变量“A”。

     

NRateDE中的错误(第19行)          A = A +(Y(2) - Y(3));

     

odearguments中的错误(第88行)   f0 = feval(ode,t0,y0,args {:}); %ODE15I将args {1}设置为yp0。

     

ode23s出错(第120行)   [neq,tspan,ntspan,next,t0,tfinal,tdir,y0,f0,odeArgs,odeFcn,...

     

RunRateNparticles出错(第20行)              [T,Y] = ode23s(@NRateDE,[T],[Yminitial Yinitial Ylinitial],[],[u0 g k a b N A]);

1 个答案:

答案 0 :(得分:0)

原始问题的解决方案已在您自己的答案中列出 Y需要有3个元素,因此您只需添加另一个初始条件。

新问题是缺少任务。 Sum函数尝试向A添加内容,但此变量尚不存在。像这样修复你的功能应该有效:

function A = Sum(Y,N)
    A = 0;
    for i=1:N
        A = A + (Y(2) - Y(3));
    end
end