2014-02-07 2 views
0

У меня есть небольшая программа, в которой я не знаю, как справиться, я ранее написал код, который бы решил для меня систему двух дифференциальных уравнений, которая отлично работает.Matlab система дифференциальных уравнений

Тем не менее, я теперь должен решить систему трех дифференциальных уравнений:

д (alphai)/дт = Ui = к * alphai * F (tethai)

д (tethai)/дт = alphai * F (tethai) - (tethai - tethaex)

д (tethaex)/дт = сигма * (Сумма (1.N) (tethai - tethaex)) - фи * 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, поэтому, пожалуйста, простите любую глупую ошибку ха-ха ».

Любая идея, подсказка?

Благодарим за помощь!

EDIT: Я немного изменил первую функцию, и «RateDE» не был преднамеренным. Также здесь появляется сообщение об ошибке:

Попытка доступа к Y (3); индекс за пределами границ, потому что numel (Y) = 2.

Ошибка в NRateDE (строка 18) dy (2) = Y (1) * exp (Y (2)) - (Y (2)) - Y (3);

Ошибка в выводах (строка 88) f0 = feval (ode, t0, y0, args {:}); % ODE15I устанавливает args {1} в yp0.

Ошибка в ode15s (строка 149) [NEQ, tspan, ntspan, рядом, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn ...

Ошибка в RunRateNparticles (строка 20) [T, Y] = ode15s (@NRateDE, [T], [Yminitial Yinitial], [], [u0 gkab NA]);


Правильно!

Я понимаю, сообщения об ошибках и исправил их путем добавления элемента на 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));

Ошибка в выводах (строка 88) f0 = feval (ode, t0, y0, args {:}); % ODE15I устанавливает args {1} в yp0.

Ошибка в ode23s (строка 120) [NEQ, tspan, ntspan, рядом, t0, tfinal, tdir, у0, f0, odeArgs, odeFcn, ...

Ошибка в RunRateNparticles (строка 20) [T, Y] = ode23s (@NRateDE, [T], [Yminitial Yinitial Ylinitial], [], [u0 gkab NA]);

+0

Это поможет, если вы разместите точное сообщение об ошибке. Я предполагаю, что вы не сделали начальное условие размера 3. – bdecaf

+0

Преднамеренно ли ваша функция называется «RateDE», а в основной программе вы используете дескриптор для «NRateDE»? – scenia

+0

RatDE не был преднамеренным, я скопировал предыдущий код. Также я добавил сообщение об ошибке. Возможно, потому, что проблема слишком жесткая? – KannonX

ответ

0

Решение исходной проблемы уже описано в вашем собственном ответе.
Y должен иметь 3 элемента, поэтому вы можете просто добавить еще одно начальное условие.

Новая проблема - недостающее задание. Функция Sum пытается добавить что-то к A, но эта переменная еще не существует. Фиксация вашей функции, подобной этой, должна работать:

Смежные вопросы