Тема 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:=proc(x,y)  x+y;  end;

Результатом вызова 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-файл, в остальных случаях - текстовый файл).

Самостоятельные упражнения

  1. Если числа n и n+2 являются простыми, то они называются простыми числами-близнецами. Найдите все простые близнецы, не превосходящие 1000.
  2. Рассмотрим четверки простых чисел, различающихся только последней цифрой (очевидно, это будут числа вида 10∙n+1, 10∙n+3, 10∙n+7, 10∙n+9). Найдите все такие четверки, не превосходящие 10000.
  3. Два числа называются дружественными, если сумма всех делителей каждого из них (кроме самих этих чисел) равна другому числу, например, 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!