Тема 5. Решение дифференциальных уравнений в системе Maple
ВВЕДЕНИЕ
В МАТЕМАТИЧЕСКИЕ ВЫЧИСЛЕНИЯ
В СИСТЕМЕ MAPLE
(часть 2)
Тема 4. Программирование в системе Maple
Система программирования Maple содержит все необходимые средства для разработки программ: условные инструкции, циклы, массивы.
Программы набираются непосредственно в рабочем листе и исполняются после нажатия клавиши <Enter>. Чтобы выполнить программу еще один раз необходимо поставить курсор на строку с программой и нажать повторно клавишу <Enter>.
Как и в языке C++, в программах на Maple не важны пробелы, переводы строк и отступы в программах, но для повышения читаемости программы длинные строки рекомендуется разбивать на несколько отдельных строчек, для чего используется комбинация клавиш <Shift>+<Enter>.
Вывод данных
Значение любого выражения, заканчивающегося символом ';' будет выведено на экран, а заканчивающегося символом ':' – не будет выведено. Но внутри инструкций if, for, while символы ';' и ':' эквивалентны: если инструкция if ... end if заканчивается символом ';', то значения всех выражений внутри инструкции if будут напечатаны, независимо от того, какими символами ';' или ':' они разделены. Аналогично и в случае разделителя ':'.
Поэтому чтобы избежать вывода большого количества информации внутри циклов, обычно циклы завершают разделителем ':', а для вывода информации используют функцию print, которая выводит на экран все свои аргументы.
|
|
Пример:
> a:=5: > print("a=",a);Более подробно о командах ввода-вывода поговорим немного далее.
Условная инструкция «if»
Синтаксис условной инструкции if такой:
> if условие then инструкции end ifгде условие может содержать операторы сравнения =, <, >, <=, >=, <>, логические операторы and, or, not, константы true и false.
инструкции – одна или несколько инструкций Maple, разделенных ';' или ':'. После инструкции end if также должен следовать разделитель.
Внутри инструкции if также может встречаться блок else в виде:
> if условие then инструкции else инструкции end ifа также одна или несколько инструкций множественного ветвления
> if условие_0 then инструкции_1 elif условие_1 then инструкции_2 else инструкции_2 end ifИтак, в наиболее общем виде инструкция if выглядит следующим образом:
> if условие then инструкции elif условие then инструкции elif условие then инструкции ................ else инструкции end ifПримеры:
> a := 3; b := 5; > if (a > b) then a else b end if; > 5*(Pi+`if`(a > b,a,b)); > x:=`if`(a > b,a,b); > a := 3; b := 5: > if (a<b) then a:=2*b elif (b<a) then b:=2*a else a:=a+b end if;Цикл «for»
Синтаксис цикла for такой:
> for переменная from значение to значение by значение do инструкции end doгде переменная – имя переменной, меняющейся в цикле, from значение – начальное значение переменной, to значение – конечное значение, by значение – величина, на которую изменяется значение переменной с каждой итерацией.
|
|
Если опустить параметр from, то начальное значение переменной будет установлено в 1, если опустить параметр to, то цикл будет бесконечным, если опустить параметр by, то переменная будет увеличиваться на 1.
Примеры:
> for i from 1 to 10 do print(i); end do: > for i from 0 to -10 by -1 do print(i); end do:Цикл «while»
Синтаксис цикла while такой:
> while условие do инструкции end doгде условие – проверяемое логическое условие. Цикл будет выполняться, пока условие истинно.
Пример:
> i:=1; while i < 10 do i:=i*2; end do;Для прерывания цикла for и while используется инструкция break. Для продолжения цикла со следующей итерации (аналог инструкции continue в С++) используется инструкция next.
Циклов с пост-условием в Maple нет.
Процедуры
Процедура на Maple-языке выглядит следующим образом:
> name:=proc( формальные параметры) тело процедуры (выражения от формальных параметров) end;Вызов процедуры осуществляется по имени. Возвращаемым значением по умолчанию является значение последнего оператора из тела процедуры. Например, процедура с именем f, вычисляющая сумму переменных x и y:
|
|
Результатом вызова f(u,sin(v)) будет выражение u+sin(v):
> f(u,sin(v));При написании процедур можно вводить локальные, определенные только внутри данной процедуры, переменные, используя описатель local. Для присвоения результату работы процедуры различных значений и выхода из нее в любом месте тела процедуры используется команда RETURN(val). Для сигнализации об ошибке и выхода из процедуры используется команда ERROR(`string`). Таким образом, общий вид процедуры следующий:
> name:=proc(parameters) local val1,...,valn; тело процедуры, в т.ч. могут встречаться RETURN(…) end;В пакете Maple процедура-функция задается следующим образом:
> name:=(parameters)->expr;Пример:
> f:=(x,y)->x+y; > simplify( f(sin(x)^2,cos(x)^2) );Для задания функции переменной var со значениями expr используется команда
> unapply(expr,var);Эта команда полезна при определении новой функции через известную или когда вычисленное выражение предполагается использовать впоследствии как функцию.
Пример:
> p :=t^2 + sin(t) + 1; > f := unapply(p,t); > f(Pi/6);Команды ввода/вывода
В данном разделе приводятся некоторые процедуры ввода-вывода. Система Maple предоставляет возможность представлять и сохранять полученные результаты в различных форматах: Maple-формате, в формате языка C, в формате языка FORTRAN и т.д.
|
|
Вывод выражения в виде FORTRAN/C-операторов осуществляется по команде:
> fortran/C([выражение]);Для вывода результатов в синтаксисе языка программирования предварительно надо подключить библиотеку:
> with(CodeGeneration):Пример:
> with(CodeGeneration): > C([d=x+y], declare=[x::numeric, y::integer]);d = x + (double) y;
Более сложный пример:
> with(CodeGeneration): > f := proc(x::Vector(4), n::integer) local i; for i to 4 do x[i]:=10*i+87 end do; end proc: > C(f, deducereturn=false);void f (int x[4], int n)
{
int i;
for (i = 1; i <= 4; i++)
x[i - 1] = 10 * i + 87;
}
Для сохранения результатов работы на диске необходимо выполнить команду:
> writeto(`name.ext`);
после этого все результаты будут записаны в файл с именем name. В зависимости от расширения файла ext тип файла может быть различным (расширение ms - файл Maple-сеанса, m - внутренний Maple-файл, в остальных случаях - текстовый файл).
Самостоятельные упражнения
- Если числа n и n+2 являются простыми, то они называются простыми числами-близнецами. Найдите все простые близнецы, не превосходящие 1000.
- Рассмотрим четверки простых чисел, различающихся только последней цифрой (очевидно, это будут числа вида 10∙n+1, 10∙n+3, 10∙n+7, 10∙n+9). Найдите все такие четверки, не превосходящие 10000.
- Два числа называются дружественными, если сумма всех делителей каждого из них (кроме самих этих чисел) равна другому числу, например, 220 и 284. Найдите все пары дружественных чисел, не превосходящих 10000.
Тема 5. Решение дифференциальных уравнений в системе Maple
Для нахождения решений дифференциальных уравнений используется команда dsolve. Рассмотрим характерные применения этой команды:
dsolve(eqns,vars) - решение уравнений eqns относительно переменных vars.
dsolve(eqns+inits,vars) - решение задачи Коши для eqns с начальными данными inits.
Можно также указывать дополнительные условия (option):
laplace - использовать трансформанту Лапласа;
series - применять разложение в ряды;
explicit - явно выражать решение через зависимую переменную;
numeric - численно решать дифференциальное уравнение.
При составлении уравнений для указания производной применяется команда diff, а команда D используется для обозначения производной при задании начальных или краевых условий.
Рассмотрим примеры задания системы дифференциальных уравнений и обращения к команде dsolve.
Рассмотрим примеры:
> deqn:=diff(y(x),x$2)+3*diff(y(x),x)+2*y(x); > dsolve(deqn,y(x));Здесь _C1 и _C2 - произвольные константы, через которые выражается решение и которые должны быть определены из дополнительных (начальных или краевых условий).
Зададим теперь краевые условия и решим то же уравнение еще раз.
> ini:=y(0)=0,y(1)=1;> dsolve({deqn,ini},y(x));
Все то же самое можно оформить несколько по-другому (численно, используя опцию numeric):
> deqn:=diff(y(x),x$2)+3*diff(y(x),x)+2*y(x); > seqn:=dsolve({deqn, y(0)=0, y(1)=1},y(x),numeric);Аргумент функции x_bvp указывает здесь на тот факт, что решается краевая задача (boundary value problem по независимой переменной x – x_bvp). Далее выведем полученное численное решение в нескольких характерных точках:
> seqn(0); seqn(0.25); seqn(0.5); seqn(0.75); seqn(1);Зададим теперь не краевые условия для нашего уравнения, а начальные условия в точке x=0, причем второе условие будет соответствовать и решим повторно нашу задачу (в данной постановке речь идет о классической задаче Коши для обыкновенного дифференциального уравнения, а не о краевой задаче, для которой дополнительные (краевые) условия задаются на разных концах интервала, на котором ищется решение):
> deqn:=diff(y(x),x$2)+3*diff(y(x),x)+2*y(x); > ini:=y(0)=0,D(y)(0)=1; > dsolve({deqn,ini},y(x));Если явное решение дифференциального урвнения не находится, то команда dsolve может быть запущена для поиска решения в виде разложения в ряд (опция series), методом преобразования Лапласа (опция laplace) или же численно (опция numeric).
Результатом работы команды dsolve с опцией numeric будет создание процедуры, к которой можно обращаться для вычисления отдельных значений или для построения графика решения на заданном промежутке решения:
> deqn:=diff(y(x),x$2)+3*diff(y(x),x)+2*y(x); > ini:=y(0)=0,D(y)(0)=1; > F:=dsolve({deqn,init},y(x),numeric);Здесь указано, что численный метод method=rkf45, примененный здесь является разновидностью метода Рунге-Кутта 4-ого порядка точности (этот высокоточный метод применяется системой по умолчанию).
> F(.5); > with(plots);> plots[odeplot](F,[x,y(x)],0..10,labels=[x,y]);
Отметим, что в приведенном примере для построения графика решения использована команда odeplot из пакета plots, который необходимо предварительно подключить (см. команду with(plots)).
Дата добавления: 2022-06-11; просмотров: 16; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!