Стандартная процедура Maxima для решения обычных дифференциальных уравнений (ОДУ) ode2
решает элементарные линейные ОДУ первого и второго порядка.
Функция contrib_ode расширяет ode2 дополнительными методами для линейных
и нелинейных ОДУ первого порядка и линейных однородных ОДУ второго порядка.
Даная программа находится в состоянии развития и форма вызова функций
может измениться в последующих релизах. После стабилизации код может
быть перемещен из директории contrib и интегрирован в ядро Maxima.
Для использования пакет должен быть загружен с помощью команды load("contrib_ode").
Функция contrib_ode вызывается также, как ode2.
Она имеет три аргумента: ОДУ (если правая часть уравнения равна 0, то достаточно задать
только левые части уравнений), зависимая переменная и независимая переменная.
В случае успеха возвращается список решений.
Представление решений отличается от такового для ode2.
Т.к. нелинейные уравнения могут иметь множественные решения., то
contrib_ode возвращает список решений. Решение может иметь
несколько различных форм:
%t
%u.
%c представляет константу интегрирования для уравнений первого порядка.
%k1 и %k2 – константы интегрирования для уравнений второго порядка.
Если contrib_ode не может получить решение, то возвращается false,
возможно, после печати сообщения об ошибке.
Необходимо возвращать список решений, т.к. нелинейные ОДУ первого порядка могут иметь множественные решения. Например:
(%i1) load("contrib_ode")$
(%i2) eqn:x*'diff(y,x)^2-(1+x*y)*'diff(y,x)+y=0;
dy 2 dy
(%o2) x (--) - (x y + 1) -- + y = 0
dx dx
(%i3) contrib_ode(eqn,y,x);
x
(%o3) [y = log(x) + %c, y = %c %e ]
(%i4) method;
(%o4) factor
Нелинейные ОДУ могут иметь особые решения, не имеющие констант интегрирования, как второе решение в следующем примере:
(%i1) load("contrib_ode")$
(%i2) eqn:'diff(y,x)^2+x*'diff(y,x)-y=0;
dy 2 dy
(%o2) (--) + x -- - y = 0
dx dx
(%i3) contrib_ode(eqn,y,x);
2
2 x
(%o3) [y = %c x + %c , y = - --]
4
(%i4) method;
(%o4) clairault
Следующее ОДУ имеет два параметрических решение в терминах переменной
%t. Из этих параметрических решений можно получить явные решения.
(%i1) load("contrib_ode")$
(%i2) eqn:'diff(y,x)=(x+y)^2;
dy 2
(%o2) -- = (y + x)
dx
(%i3) contrib_ode(eqn,y,x);
(%o3) [[x = %c - atan(sqrt(%t)), y = - x - sqrt(%t)],
[x = atan(sqrt(%t)) + %c, y = sqrt(%t) - x]]
(%i4) method;
(%o4) lagrange
Следующий пример (Камке 1.112) демонстрирует неявное решение.
(%i1) load("contrib_ode")$
(%i2) assume(x>0,y>0);
(%o2) [x > 0, y > 0]
(%i3) eqn:x*'diff(y,x)-x*sqrt(y^2+x^2)-y;
dy 2 2
(%o3) x -- - x sqrt(y + x ) - y
dx
(%i4) contrib_ode(eqn,y,x);
y
(%o4) [x - asinh(-) = %c]
x
(%i5) method;
(%o5) lie
Следующее уравнение Рикатти преобразуется в линейное ОДУ второго порядка
для переменной %u. Maxima не может решить новое уравнение, и оно
возвращается нерешенным.
(%i1) load("contrib_ode")$
(%i2) eqn:x^2*'diff(y,x)=a+b*x^n+c*x^2*y^2;
2 dy 2 2 n
(%o2) x -- = c x y + b x + a
dx
(%i3) contrib_ode(eqn,y,x);
d%u
--- 2
dx 2 n - 2 a d %u
(%o3) [[y = - ----, %u c (b x + --) + ---- c = 0]]
%u c 2 2
x dx
(%i4) method;
(%o4) riccati
Для ОДУ первого порядка contrib_ode вызывает ode2.
Затем применяются методы: факторизации, Клеро, Лагранжа, Рикатти,
Абеля и метод симметрий Ли. Метод Ли не применяется к уравнениям Абеля,
если метод Абеля не дает результата, но применяется если метод Рикатти
возвращает нерешенное ОДУ второго порядка.
Для ОДУ второго порядка contrib_ode вызывает ode2, а затем odelin.
Если выполнена команда put('contrib_ode,true,'verbose), то
печатается подробная отладочная информация.
Возвращает список решение ОДУ eqn с независимой переменной x и зависимой переменной y.
Функция odelin решает линейные однородные ОДУ первого и второго
порядка с независимой переменной x и зависимой переменной y.
Она возвращает фундаментальный набор решений ОДУ.
Для ОДУ второго порядка odelin использует метод Бронштейна-Лафаля,
который ищет решение в терминах заданных специальных функций.
(%i1) load("contrib_ode");
(%i2) odelin(x*(x+1)*'diff(y,x,2)+(x+5)*'diff(y,x,1)+(-4)*y,y,x);
...trying factor method
...solving 7 equations in 4 variables
...trying the Bessel solver
...solving 1 equations in 2 variables
...trying the F01 solver
...solving 1 equations in 3 variables
...trying the spherodial wave solver
...solving 1 equations in 4 variables
...trying the square root Bessel solver
...solving 1 equations in 2 variables
...trying the 2F1 solver
...solving 9 equations in 5 variables
gauss_a(- 6, - 2, - 3, - x) gauss_b(- 6, - 2, - 3, - x)
(%o2) {---------------------------, ---------------------------}
4 4
x x
Возвращает значение ОДУ eqn после подстановки в него возможного решения soln. Значение эквивалентно нулю, если soln является решением eqn.
(%i1) load("contrib_ode")$
(%i2) eqn:'diff(y,x,2)+(a*x+b)*y;
2
d y
(%o2) --- + (a x + b) y
2
dx
(%i3) ans:[y = bessel_y(1/3,2*(a*x+b)^(3/2)/(3*a))*%k2*sqrt(a*x+b)
+bessel_j(1/3,2*(a*x+b)^(3/2)/(3*a))*%k1*sqrt(a*x+b)];
3/2
1 2 (a x + b)
(%o3) [y = bessel_y(-, --------------) %k2 sqrt(a x + b)
3 3 a
3/2
1 2 (a x + b)
+ bessel_j(-, --------------) %k1 sqrt(a x + b)]
3 3 a
(%i4) ode_check(eqn,ans[1]);
(%o4) 0
Переменной method присваивается название метода успешного решения ОДУ.
%c – константа интегрирования для ОДУ первого порядка.
%k1 – первая константа интегрирования для ОЛУ второго порядка.
%k2 – вторая константа интегрирования для ОЛУ второго порядка.
Функции gauss_a(a,b,c,x) и gauss_b(a,b,c,x) есть 2F1
гипергеометрические функции. Они представляют собой два независимых решения
гипергеометрического уравнения
x(1-x) diff(y,x,2) + [c-(a+b+1)x diff(y,x) - aby = 0 (A&S 15.5.1).
Эти функции используются только в решениях ОДУ, возвращаемых
odelin и contrib_ode. Определение и использование этих
функций может измениться в последующих релизах Maxima.
См. также gauss_b, dgauss_a и gauss_b.
См. gauss_a.
Производная gauss_a(a, b, c, x) по x.
Производная gauss_b(a, b, c, x) по x.
M-функция Куммера, как она определена в Abramowitz и Stegun, Handbook of Mathematical Functions, Section 13.1.2.
Эта функция используются только в решениях ОДУ, возвращаемых
odelin и contrib_ode. Определение и использование этой
функции может измениться в последующих релизах Maxima.
См. также kummer_u, dkummer_m и dkummer_u.
U-функция Куммера, как она определена в Abramowitz и Stegun, Handbook of Mathematical Functions, Section 13.1.3.
См. kummer_m.
Производная kummer_m(a, b, x) по x.
Производная kummer_u(a, b, x) по x.
Данные процедуры находятся в процессе разработки. Необходимо:
ode1_factor для работы с множественными корнями.
ode1_factor для решения с множителями
высокого порядка. В настоящий момент метод пытается решить только линейные множители.
ode1_lagrange для преимущественного
использования вещественных корней по отношению с комплексными.
ode1_lie.
С этой процедурой имеется довольно много проблем:
некоторые части не реализованы, некоторые тесты зацикливаются,
некотрые тесты завершаются ошибкой, другие тесты дают слишком сложные
"решения". Данная процедура еще не готова для практического
использования.
Процедуры были протестированы на приблизительно одной тысяче примеров из книг Murphy, Kamke, Zwillinger и других. Эти тесты включены в директорию tests.
ode1_clairault находит все известные решения,
включая особые решения уравнения Клеро из книг Murphy и Kamke.
ode1_lie, излишне сложны и их невозможно
проверить.