Для решения обыкновенных
дифференциальных уравнений и систем
используется команда
dsolve (уравнения, переменные, опции),
где уравнения - заданные дифференциальные
уравнения, переменные - те переменные по
отношению к которым ищется решение, опции -
необязательные опции, задаваемые в виде ключевое
слово=значение.
Команда dsolve способна решать
аналитически большое количество
дифференциальных уравнений.
Если задана опция type=exact, то команда
пытается найти аналитическое решение - эта опция
задана по умолчанию. Другие возможные значения
этой опции type=series (в этом случае решение ищется в
виде ряда) и type=numeric (в этом случае ищется
численное решение).
Можно задать еще несколько опций,
которые определяют: будет ли решение искаться в
явном виде или нет ( explicit=true или explicit=false ),
задают метод решения (например method=laplace
)
Если задана опция type=numeric , то можно
также задать метод численного расчета, например
method=rkf45 - метод Рунге-Кутта
четвертого-пятого порядка;
method=dverk78 - метод Рунге-Кутта
седьмого-восьмого порядка,
method=classical - содержит несколько
классических методов (Эйлера, Рунге-Кутта
третьего порядка и некоторые другие),
method=gear и method=mgear -
одношаговый и многошаговый методы Гира. Приведем
примеры
> dsolve(diff(y(x),x$2) - y(x) =
sin(x)*x, y(x));
В полученном решении _С1, _С2 -
произвольные постоянные. Начальные условия в
дифференциальных уравнениях задаются через
запятую, при этом уравнение и начальное условие
объединяются в набор.
> restart;dsolve({diff(v(t),t)+2*t=0,
v(1)=5}, v(t));
Производные в начальных условиях
записываются в операторном виде (как D(D(y))(0) или
(D@@2)(y)(0)).
> de1 := diff(y(t),t$2) +
5*diff(y(t),t) + 6*y(t) = 0;
> dsolve({de1, y(0)=0, D(y)(0)=1},
y(t),method=laplace);
Уравнение четвеертого порядка
> de2 :=
diff(y(x),x$4)+2*diff(y(x),x$2) -cos(x)=3;
> dsolve(de2,y(x)):combine(%);
Для следующего уравнения решение
находится только методом замены переменных
> restart;q:=(2*sqrt(x*y(x))-x)*diff(y(x),x)+y(x);
Для замены переменных применчется
команда Dchangevar пакета DEtools
> with(DEtools):f:=Dchangevar({y(x)=v(x)*x},[q],x);
Теперь находим решение для функции v(x)
> w:=dsolve(f,v(x));
Чтобы получить искомое решение y(x)
делаем облатную подстановку
> W1:=subs({v(x)=y(x)/x},w[1]);W2:=subs({v(x)=y(x)/x},w[2]);
> Y1:=solve(W1,y(x));Y2:=solve(W2,y(x));
> Z1:=simplify(subs(_C1=1,Y1));Z2:=simplify(subs(_C1=1,Y2));
> plot({Z1,Z2},x=0..3);
Можно найти функции, линейная
комбинация которых даст полное решение
дифференциального уравнения. Для этого в команду
dsolve добавляется опция output=basis :
> dsolve(2*x*diff(y(x),x$2)+diff(y(x),x)+3*y(x)=x,y(x),output=basis);
Система дифференциальных уравнений
вместе с начальными данными записывается в виде
набора (последовательности выражений в фигурных
скобках) в аргументе команды dsolve
> sys := diff(y(x),x)=z(x)-y(x)-x,
diff(z(x),x)=y(x):
> fcns := {y(x), z(x)}:
> Y:=dsolve({sys,y(0)=0,z(0)=1},
fcns);
> plot({rhs(Y[1]),rhs(Y[2])},x=-2..7);
Решение этой же системы можно найти
также в виде степенных рядов
> dsolve({sys,y(0)=0,z(0)=1}, fcns,
type=series);
Численное решение той же системы
достигается простой установкой опции type=numeric
> F := dsolve({sys,y(0)=0,z(0)=1},
fcns, type=numeric);
Как видим, решение выводится в виде
процедуры нахождения численных значений методом
Рунге-Кутта, используемом программой по
умолчанию. Чтобы найти решение при значении
независимой переменной x равном, скажем, 1
достаточно записать:
> F(-2);
В следующем примере в команде dsolve
явно указан метод решения системы
дифференциальных уравнений, а также массив
начальных значений независимой переменной, для
которых мы хотим получить результат.
> sys2 := {(D@@2)(y)(x)=2*x^3*y(x),
y(0)=1, D(y)(0)=1}:
s := dsolve(sys2, {y(x)}, type=numeric, method=dverk78,
value=array([1.0,1.5,1.7]));
Так можно извлечь из массива конкретное
значение.
> s[2,1][2,3];
Maple V 4.0 имеет эффективные алгоритмы
для решения жестких дифференциальных уравнений
и систем
Один из таких алгоритмов - метод
одношаговой интерполяции Гира применен для
решения следующего уравнения
> Digits := 10:
deq1 := {diff(y(x), x$3) = y(x)*diff(y(x), x)-x}:
init1 := {(D@@2)(y)(1) = 4, D(y)(1) = 3, y(1) = 2.4 }:
ans1 := dsolve(deq1 union init1, y(x), type=numeric,
method=gear[polyextr], stepsize=0.015, minstep=Float(1,-11),
errorper=Float(1,-5)):
ans1(1.01);
При решении следующего
дифференциального уравнения применен метод
многошаговой интерполяции Гира.
> Digits := 12:
deq3 := diff(y(t), t$2) = 100*(exp(-10*t)+exp(10*t)):
ans3 := dsolve({deq3}, y(t), numeric, method=mgear[msteppart],
initial=array([2,0]), start=0):
ans3(0.7653);
Рассмотрим дифференциальное уравнение
Ньютона, описывающее движение тела под действием
периодической силы и учитывающее упругую силу kf(x)
> restart;
deq:= m*diff(x(t),t,t)+k*x(t)=a*cos(omega*(t-t0));
Для решения этого уравнения применим
метод преобразования Фурье
> with(inttrans):F:=fourier(deq,t,ti);
Теперь решим полеченное алгебраическое
уравнение относительно преобразования фурье от
искомой функции f(x)
> S:=solve(F,fourier(x(t),t,ti));
При разумном допущении относительно
частоты колебаний получим после упрощения
> assume(omega>0);simplify(S);
В последнюю формулу входит обобщенная
функция Дирака Dirac. Теперь при помощи
обратного Фурье-преобразования найдем искомую
функцию
> invfourier(%,ti,t);
> simplify(%);
|