2015-05-10 4 views
1

дана система дифференциальных уравнений, таких как:MATLAB система зависимых дифференциальных уравнений

dy/dt = f(t) 
dx/dt = g(t) 

Решение может быть найдено с помощью dsolve, таких как:

dsolve(diff(y) == f(t), diff(x) == g(t), y(0) == 1, x(0) == 1); 

Но что в системе, где все переменные зависят друг от друга:

dy/dt = f(y,z) 
dx/dt = g(x,y) 
dz/dt = h(z,x) 

При приближении к тому же, с начальными условиями, для системы, которая имеет решение, я не могу найти решение.

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

Я специально ищу решение, где производные все равны нулю, если это помогает.

РЕДАКТИРОВАТЬ:

Вот пример:

PX/dt = (k_tl*(a0_tr + ((a_tr*KM^n)/((KM^n) + (PZ^n))))/kd_mRNA)-kd_prot*PX; 
PY/dt = (k_tl*(a0_tr + ((a_tr*KM^n)/((KM^n) + (PX^n))))/kd_mRNA)-kd_prot*PY; 
PZ/dt = (k_tl*(a0_tr + ((a_tr*KM^n)/((KM^n) + (PY^n))))/kd_mRNA)-kd_prot*PZ; 

с коэффициентами:

eff = 20; 

KM = 40; 

tau_mRNA=2.0; 
tau_prot=10; 

ps_a=0.5; 
ps_0=5.0E-4; 

t_ave = tau_mRNA/log(2); 

k_tl=eff/t_ave; 

a_tr=(ps_a-ps_0)*60; 
a0_tr=ps_0*60; 

kd_mRNA = log(2)/tau_mRNA; 
kd_prot = log(2)/tau_prot; 

beta = tau_mRNA/tau_prot; 
alpha = a_tr*eff*tau_prot/(log(2)*KM); 
alpha0 = a0_tr*eff*tau_prot/(log(2)*KM); 
n=2; 

И начальные условия:

PX0 = 20; 
PY0 = 0; 
PZ0 = 0; 

Это дает ответ:

Response

Это, очевидно, имеет стационарное решение (все производные 0).

В MATLAB я пробовал:

%% 
syms PX(t) PY(t) PZ(t); 

z = dsolve(diff(PX) == (k_tl*(a0_tr + ((a_tr*KM^n)/((KM^n) + (PZ^n))))/kd_mRNA)-kd_prot*PX, diff(PY) == (k_tl*(a0_tr + ((a_tr*KM^n)/((KM^n) + (PX^n))))/kd_mRNA)-kd_prot*PY, diff(PZ)==(k_tl*(a0_tr + ((a_tr*KM^n)/((KM^n) + (PY^n))))/kd_mRNA)-kd_prot*PZ,PX(0)==20) 

и:

%% 
eq1 = (k_tl*(a0_tr + ((a_tr*KM^n)/((KM^n) + (PZ^n))))/kd_mRNA)-kd_prot*PX; 
eq2 = (k_tl*(a0_tr + ((a_tr*KM^n)/((KM^n) + (PX^n))))/kd_mRNA)-kd_prot*PY; 
eq3 = (k_tl*(a0_tr + ((a_tr*KM^n)/((KM^n) + (PY^n))))/kd_mRNA)-kd_prot*PZ; 

dsolve(diff(PX)==eq1,PX(0)==20,diff(PY)==eq2,PY(0)==0,diff(PZ)==eq3,PZ(0)==0) 

Оба не производят никаких ошибок, но возвращать пустой SYM.

+2

«Когда подошли таким же образом, с начальными условиями для системы, которая действительно имеет решение, Я не могу найти решение. Вы собираетесь поделиться этой системой, и это решение с нами? Когда вы говорите «может создавать решения», вы имеете в виду, что система имеет аналитические решения или что вы смогли ее решить численно? Вы должны сделать свой вопрос более конкретным. Покажите свой реальный код, чтобы другие могли реплицировать вашу проблему. – horchler

+0

Обновлено с примерами. – user2290362

ответ

1

Ваше числовое решение, похоже, имеет колебательный компонент. «Стационарное» состояние может быть предельным циклом нулевой амплитуды, что является нетривиальным решением. Вы определенно не должны ожидать, что такая система будет иметь легкодоступное аналитическое решение. Циклические отношения между вашими тремя переменными также не помогают. Для чего это стоит, Mathematica 10's DSolve также не может найти решение.

Хотя это не поможет вам решить, как вы используете символическую математику, является менее оптимальным. Когда вы используете что-то вроде log(2) в символическом математическом уравнении, 2 следует сначала преобразовать в символическое значение. Например, sym(log(2)) дает приближение 6243314768165359/9007199254740992, тогда как log(sym(2)) возвращает точный log(2). Эта последняя форма гораздо более вероятно приведет к решениям, если они существуют.Вот модифицированная версия кода, которая, к сожалению, до сих пор возвращает «Предупреждение: Явное решение не может быть найдено»:

eff = 20; 

KM = 40; 

tau_mRNA=2; 
tau_prot=10; 

ps_a=1/sym(2); 
ps_0=5/sym(10000); 

ln2 = log(sym(2)); 
t_ave = tau_mRNA/ln2; 

k_tl=eff/t_ave; 

a_tr=(ps_a-ps_0)*60; 
a0_tr=ps_0*60; 

kd_mRNA = ln2/tau_mRNA; 
kd_prot = ln2/tau_prot; 

beta = tau_mRNA/tau_prot; 
alpha = a_tr*eff*tau_prot/(ln2*KM); 
alpha0 = a0_tr*eff*tau_prot/(ln2*KM); 
n=2; 

PX0 = 20; 
PY0 = 0; 
PZ0 = 0; 

syms PX(t) PY(t) PZ(t); 

eq1 = (k_tl*(a0_tr + a_tr*KM^n/(KM^n + PZ^n))/kd_mRNA)-kd_prot*PX; 
eq2 = (k_tl*(a0_tr + a_tr*KM^n/(KM^n + PX^n))/kd_mRNA)-kd_prot*PY; 
eq3 = (k_tl*(a0_tr + a_tr*KM^n/(KM^n + PY^n))/kd_mRNA)-kd_prot*PZ; 

s = dsolve(diff(PX,t)==eq1,diff(PY,t)==eq2,diff(PZ,t)==eq3,PX(0)==20,PY(0)==0,PZ(0)==0) 
+0

Я могу получить численные решения, которые сложны и немного сумасшедшие. Это означает, что система никогда не перестанет колебаться, и поэтому я должен просто прочитать график, который я опубликовал для значения устойчивого состояния? Еще один вопрос: могу ли я создать матрицу якобиана, не имея возможности решить эту проблему, и могу ли я оценить ее в точке, которую я прочитал с графика? Я думаю, что это может быть единственным способом охарактеризовать систему. – user2290362

+0

@ user2290362: вы задаете вопросы, выходящие далеко за рамки вашего исходного вопроса, и в какой-то степени не по теме для этого сайта, поскольку они, похоже, больше касаются математики, чем программирования , Я не знаю, как вы моделируете численно - я бы предложил использовать решатель, например 'ode15s', чтобы обеспечить правильное захват высокочастотных колебаний из-за жесткости. Да, вы можете определенно попытаться линеаризировать это о числовой точке, с которой, похоже, сходится ваша симуляция. Это может быть привлекательное/стабильное трехмерное спиральное равновесие (описывающее равновесие в более чем 2-D часто проблематично). – horchler

+0

Хорошо, я обнаружил, что система спирали вокруг точки равновесия. Существует ли лучший способ решения стационарного состояния в этом случае? Вместо того, чтобы устанавливать производные в 0, так как они никогда не равны 0, если они являются спиральными. – user2290362

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