Рисование кривых решения дифференциальных уравнений

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

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

dN\dt= bN^2 - aN

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

Как бы я поступил?

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


person dinosaur    schedule 23.07.2011    source источник
comment
{a, b, N(0)} и {a, b, K, N(0)} — два больших пространства параметров. Вы должны указать область интереса. (Например, a==b в первом уравнении)...   -  person Dr. belisarius    schedule 23.07.2011


Ответы (4)


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

Определять

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}]

который возвращает решение ОДУ, т. е. 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}}]

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

введите здесь описание изображения

или, чтобы получить некоторое представление о решениях, можно интерактивно управлять значениями 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}]

который дает что-то вроде

введите здесь описание изображения

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

Конечно, это можно сделать произвольно более сложным. Кроме того, в этом конкретном случае это ОДУ достаточно легко интегрировать аналитически, но этот численный подход может быть применен к общим ОДУ (и ко многим УЧП тоже).

person acl    schedule 23.07.2011
comment
Поскольку NDSolve принимает список начальных условий, вы также можете сделать что-то вроде Plot[(Evaluate[p1[Range[0, 1, .05], 1, 1][t]]), {t, 0, 5}], чтобы отобразить список решений на том же графике. - person Heike; 24.07.2011

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

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

введите здесь описание изображения

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

person Szabolcs    schedule 26.07.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, но получил такой результат:

Сюжет n[t]

person Codie CodeMonkey    schedule 23.07.2011

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

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

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

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

person Darren Engwirda    schedule 23.07.2011
comment
Действительно, у меня сложилось впечатление, что проще обрабатывать ОДУ многих переменных (т. е. системы ОДУ) в Matlab, чем в Mathematica, используя векторную запись. Для одной или нескольких переменных я предпочитаю Mathematica. - person Szabolcs; 26.07.2011