2014-02-12 2 views
1

Я пытаюсь решить систему из 6 дифференциальных уравнений с использованием matlab. Я создал набор из 6 дифференциальных уравнений следующим образом в функции м файл с именем Untitled.mсистема из 6 дифференциальных уравнений

function ydot=Untitled(t,y) 
ydot = zeros(6,1); 
%y(1)=A 
%y(2)=B 
%y(3)=C 
%y(4)=D 
%y(5)=P 
%y(6)=T; 

A=0.50265; 
k11=(333/106.7)*1.15*1000*exp(-59660/(8.314*960)); 
k31=(333/40)*73.6*exp(-47820/(8.314*960)); 
k32=(333/14.4)*1.79*exp(-30950/(8.314*960)); 
k21=(106.7/40)*426*exp(-68830/(8.314*960)); 
k22=(106.7/14.4)*0.000599*exp(-57740/(8.314*960)); 
Pcat=1450; 
g=9.81; 
%phi=exp(-(59100*exp(-67210/(8.314*y(6))))*((0.50265*1450*33)/143.64)); 
H11=393000; 
H31=795000; 
H32=1200000; 
H21=1150000; 
H22=151000; 
E=1-((285.765*17.56)/((6.1*1450)+(17.56*285.765))); 
Fcat=143.64; 
Cpcat=1087; 
%Cp=1000*(y(1)*3.3+y(2)*3.3+y(3)*3.3+y(4)*1.087); 
F=19.95; 




ydot(1)= -(A*(1-E)*Pcat*(k11+k31+k32)*(exp(-(59100*exp(-67210/(8.314*y(6))))*((0.50265*1450*33)/143.64)))*y(1)*y(1))/F; 
ydot(2)= (A*(1-E)*Pcat*(k11*y(1)*y(1)-(k21+k22)*y(2))*(exp(-(59100*exp(-67210/(8.314*y(6))))*((0.50265*1450*33)/143.64))))/F; 
ydot(3)= (A*(1-E)*Pcat*(k31*y(1)*y(1)+ k21*y(2))*(exp(-(59100*exp(-67210/(8.314*y(6))))*((0.50265*1450*33)/143.64))))/F; 
ydot(4)= (A*(1-E)*Pcat*(k32*y(1)*y(1)+k22*y(2))*(exp(-(59100*exp(-67210/(8.314*y(6))))*((0.50265*1450*33)/143.64))))/F; 
ydot(5)= -(Pcat*g*(1-E)); 
%dydz(6)= ((1-E)*Pcat*A*(((k11+k31+k32)*phi*y(1)*y(1)*-H1)+ ((k11*y(1)*y(1)-(k21+k22)*y(2))*phi*-H2)+((k31*y(1)*y(1)+ k21*y(2))*phi*H3)+((k32*y(1)*y(1)+k22*y(2))*phi*H4)))/(F*Cp+Fcat*Cpcat) 
ydot(6) = (((exp(-(59100*exp(-67210/(8.314*y(6))))*((0.50265*1450*33)/143.64)))*(1-E)*Pcat*A)*(y(1)*y(1)*((k11*H11)+(k31*H31)+(k32*H32))+y(2)*((k21*H21)+(k22*H22)))/((F*(1000*(y(1)*3.3+y(2)*3.3+y(3)*3.3+y(4)*1.087)))+(Fcat*Cpcat))); 

Затем я создал еще один файл для использования ode45 решатель для решения уравнений

function ode() 

options = odeset('RelTol',1e-1,'AbsTol',[1e-1 1e-1 1e-1 1e-1 1e-1 1e-1 ]); 
Y0=[1.0;0.0;0.0;0.0;180000.0;959.81]; 
zspan=0:0.1:33; 

[z,y]= ode45(@Untitled,zspan,Y0,options); 

figure 
hold on 
plot(z,y(:,5)); 

код компилирует, но не решает систему дифференциальных уравнений и дает только прямой линейный граф при начальном значении переменных. например, начальное значение y (1) равно 1, поэтому я получаю график при y = 1.

может кто-нибудь сказать мне, что происходит не так

+0

Untitled.m предупреждает, что «входной аргумент z может быть не использован, но используется более поздний входной аргумент»; поэтому я думаю, что он не получает уравнения диффузии правильно ... но я понятия не имею, что с этим делать ... пожалуйста, помогите – user3277001

+1

Это просто означает, что 't' не используется при вычислении производных. Я протестировал 'Untitled (0, Y0)' и получил 'ydot = [0; 0; 0; -5148; 0]', поэтому похоже, что они должны быть прямыми линиями, кроме 'y (5)'. Проверьте свои производные! – David

ответ

2

Кажется, ваша производная плохо масштабируется, или просто неправильно.

5-й элемент ydot является

-(Pcat*g*(1-E)); 

, который содержит только константы и поэтому постоянной. Следовательно, это приведет к прямой линии с отрицательным наклоном.

Остальные 5 элементов ydot содержат такие термины, как

exp(-59100*exp(-67210/(...))*(...)) 

Это почти наверняка опустошение, смысл, значение слишком мало, чтобы выразить в числах с двойной точностью, и, следовательно, будут равен 0. Тех также приведет к прямым линиям, на этот раз по горизонтали и при значении, равном их начальному значению.

Значение exp(-745.1332...) (равное 4.940656458412465e-324) является самым низким, с которым вы сможете отправиться. И это значение уже сложно, так как оно вырождено (exp(-724) < realmin).

Таким образом, либо вы испортили свои уравнения, либо вам необходимо перераспределить уравнения так, чтобы вероятность переполнения/недополнения внутри пространства решений была сведена к нулю.

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