Построение кривых решения для дифференциальных уравнений - PullRequest
1 голос
/ 23 июля 2011

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

Вот уравнения:

dN\dt= bN^2 - aN

dN\dt = bN^2 (1 - N\K) - aN

Как мне это сделать?

Меня не волнует, какой язык используется. Что касается математики, у меня есть mathematica и matlab на моем компьютере. У меня есть доступ к клену. Мне нужно больше заниматься этим, и я хотел бы иметь примеры на любом языке, так как это поможет мне понять, какой из них я хочу использовать, и выучить его.

Ответы [ 4 ]

7 голосов
/ 23 июля 2011

Я сделаю вид, что первое не может быть решено аналитически, чтобы показать, как можно играть с общим ODE в mathematica.

Определить

p1[n0_, a_, b_, uplim_: 10] :=(n /. First@NDSolve[
      {n'[t] == b*n[t]^2 - a*n[t], n[0] == n0},n, {t, 0, uplim}]

, который возвращаетрешение ODE, то есть a = p1[.1, 2., 3.], а затем, например, a[.3] говорит вам n(.3).Затем можно сделать что-то вроде

Show[Table[ans = p1[n0, 1, 1];
 Plot[ans[t], {t, 0, 10}, PlotRange \[Rule] Full],
 {n0, 0, 1, .05}], PlotRange \[Rule] {{0, 5}, {0, 1}}]

, которое строит несколько решений с различными начальными значениями:

enter image description here

или, чтобы получить некоторое представление о решениях,можно в интерактивном режиме манипулировать значениями a, b и n0:

Manipulate[
 ans = p1[n0, a, b];
 Plot[ans[t], {t, 0, 10},PlotRange -> {0, 1}],
 {{n0, .1}, 0, 1},
 {{a, 1}, 0, 2},
 {{b, 1}, 0, 2}]

, что дает что-то вроде

enter image description here

с помощью элементов управленияактивный (т.е. вы перемещаете их, и график меняется; попробуйте вживую, чтобы понять, что я имею в виду; обратите внимание, что вы можете установить параметры, для которых начальные условия дают расходящиеся решения).

Конечно, это может быть сделано произвольно большесложно.Также в этом конкретном случае этот ODE достаточно прост для аналитической интеграции, но этот численный подход может быть применен к универсальным ODE (и ко многим PDE тоже).

2 голосов
/ 26 июля 2011

В дополнение к нескольким хорошим ответам, если вам просто нужен быстрый набросок решений ODE для многих начальных значений, для руководства вы всегда можете сделать однострочную StreamPlot. Предположим, a==1 и b==1, а также dy/dx == x^2 - x.

StreamPlot[{1, x^2 - x}, {x, -3, 3}, {y, -3, 3}]

enter image description here

StreamStyle -> "Line" даст вам только строки, без стрелок.

0 голосов
/ 23 июля 2011

Если вы счастливы численно решить уравнения, MATLAB имеет набор решателей ODE, которые могут быть полезны. Ознакомьтесь с документацией для функции ode45 здесь .

Общий подход заключается в определении «функции Оде», которая описывает правую часть дифференциальных уравнений. Затем вы передаете эту функцию вместе с начальными условиями и диапазоном интегрирования решателям ode.

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

Надеюсь, это поможет.

0 голосов
/ 23 июля 2011

В Mathematica вы используете NDSolve (если это не может быть решено аналитически, в этом случае вы используете DSolve. Поэтому для вашего первого уравнения я попытался:

b = 1.1; a = 2;
s = NDSolve[{n'[t] == b n[t]^2 - a n[t], n[0] == 1}, n, {t, 0, 10}];
Plot[Evaluate[n[t] /. s], {t, 1, 10}, PlotRange -> All]

Я не знал, что использовать для a, b или N0, но я получил такой результат:

Plot of n[t]

...