Задача 1 

Дан тонкий однородный стержень 0<x<l, боковая поверхность которого теплоизолирована.  

Найти распределение температуры u(x,t) в стержне, если концы стержня поддерживаются при нулевой температуре,  

а Typesetting:-mrow(Typesetting:-mfrac(Typesetting:-mrow(Typesetting:-mi( 

Решение поставленной задачи сводится к решению смешанной (начально-краевой) задачи для уравнения теплопроводности, которое относится к уравнениям параболического типа.  

Решение. 

Команда restart очищает значение всех переменных.  

Typesetting:-mi( 

Задаем уравнение теплопроводности: 

Typesetting:-mrow(Typesetting:-mi( 

где u(x,t) температура стержня в точке x в момент времени t, a связано с коэффициентами теплоемкости и теплопроводности. 

Уравнение заносится в переменную eq , для того, чтобы в дальнейшем можно было сослаться на эту переменную в своих вычислениях. При этом мы используем знак присвоения ":=". Если использовать двоеточие после командыTypesetting:-mo(Maple выполнит ее, но не покажет результат. Это бывает удобно, когда много мелких команд. 

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

Typesetting:-mrow(Typesetting:-mi( 

Typesetting:-mrow(Typesetting:-mi( 

Typesetting:-mrow(Typesetting:-mi( 

Будем искать решение методом разделения переменных. 

Для решения уравнения в частных производных имеются команда pdsolve и набор команд пакета PDEtools. Обращение к команде  имеет следующий вид: pdsolve(PDE,FUN,OPT), где PDE уравнение, FUN неизвестная функция, а OPT дополнительные параметры. Пакет Maple пытается найти общее решение, используя набор специальных методов для некоторых видов уравнений и метод разделения переменных в общем случае. Ответ может быть представлен специальной структурой PDESolStruc, которая содержит  термин &where и состоит из двух полей: функционального представления и перечня обыкновенных дифференциальных уравнений, полученных в результате процедуры разделения переменных. Данная структура предназначена для указания возможных решений. Решение при этом может быть получено с помощью команды build из пакета PDEtools. В качестве дополнительных параметров OPT могут использоваться: указание на возможную форму решения HINT=HI, параметр INTEGRATE, означающий автоматическое интегрирование получающейся системы обыкновенных дифференциальных уравнений, указание на поиск явного решения build. В качестве HI могут стоять знаки суммы и произведения или алгебраическое выражение. Уравнения могут быть заданы непосредственно в теле команды, а могут быть присвоены некоторой переменной (как в данном случае).  

Typesetting:-mrow(Typesetting:-mi( 

PDESolStruc(u(x, t) = `*`(T(t), `*`(X(x))), [{diff(T(t), t) = `*`(`^`(a, 2), `*`(T(t), `*`(_c[1]))), diff(diff(X(x), x), x) = `*`(_c[1], `*`(X(x)))}]) (1.1.1)
 

 

Нас интересуют два уравнения, которые находятся в квадратных скобках. Извлечь конкретный элемент или несколько элементов из уравнения можно с помощью команды op (i, struc), где struc структура данных из которой нужно извлечь выражение, а i целое число. 

Typesetting:-mrow(Typesetting:-mi( 

[{diff(T(t), t) = `*`(`^`(a, 2), `*`(T(t), `*`(_c[1]))), diff(diff(X(x), x), x) = `*`(_c[1], `*`(X(x)))}] (1.1.2)
 

 

Typesetting:-mrow(Typesetting:-mi( 

diff(diff(X(x), x), x) = `*`(_c[1], `*`(X(x))) (1.1.3)
 

Хорошо известно, что физически осмысленные решения получаются при выборе отрицательной константы разделения. Теперь нужно сделать замену переменной Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( . Замену переменной можно провести в ручную, либо воспользовавшись командой subs, структура которой следующая: subs(x=a,EXPR), где x и а заменяемые переменные, а EXPR выражение, в котором происходит замена. 

Typesetting:-mrow(Typesetting:-mi( 

diff(diff(X(x), x), x) = `+`(`-`(`*`(lambda, `*`(X(x))))) (1.1.4)
 

Введем ограничение переменной Typesetting:-mrow(Typesetting:-mi( , которая должна быть больше "0", для этого воспользуемся командой assume() 

Typesetting:-mrow(Typesetting:-mi( 

Для аналитического и численного решения обыкновенных дифференциальных уравнений используется команда dsolve, причем во всех случаях используется единый формат команды: dsolve(ODE,VAR,OPT). Здесь ODE дифференциальное уравнение или система дифференциальных уравнений относительно неизвестных функции VAR, а i дополнительные параметры. Для решения задачи Коши  в уравнения ODE нужно включить так же начальные условия, а для краевой задачи соответственно краевые условия.  

Typesetting:-mrow(Typesetting:-mi( 

X(x) = `+`(`*`(_C1, `*`(sin(`*`(`^`(lambda, `/`(1, 2)), `*`(x))))), `*`(_C2, `*`(cos(`*`(`^`(lambda, `/`(1, 2)), `*`(x)))))) (1.1.5)
 

Для того, чтобы преобразовать наше уравнение в функцию можно воспользоваться командой unapply: 

Typesetting:-mrow(Typesetting:-mi( 

proc (x) options operator, arrow; `+`(`*`(_C1, `*`(sin(`*`(`^`(lambda, `/`(1, 2)), `*`(x))))), `*`(_C2, `*`(cos(`*`(`^`(lambda, `/`(1, 2)), `*`(x)))))) end proc (1.1.6)
 

Найдем постоянные Typesetting:-mi( и Typesetting:-mrow(Typesetting:-mi( из начальных условий: 

Typesetting:-mrow(Typesetting:-mi( 

_C2 = 0 (1.1.7)
 

Typesetting:-mrow(Typesetting:-mi( 

`+`(`*`(_C1, `*`(sin(`*`(`^`(lambda, `/`(1, 2)), `*`(l))))), `*`(_C2, `*`(cos(`*`(`^`(lambda, `/`(1, 2)), `*`(l)))))) = 0 (1.1.8)
 

Составим систему из полученных уравнений: 

Typesetting:-mrow(Typesetting:-mi( 

{_C2 = 0, `+`(`*`(_C1, `*`(sin(`*`(`^`(lambda, `/`(1, 2)), `*`(l))))), `*`(_C2, `*`(cos(`*`(`^`(lambda, `/`(1, 2)), `*`(l)))))) = 0} (1.1.9)
 

Запишем матрицу коэффициентов системы при помощи команды  Typesetting:-mrow(Typesetting:-mi( 

Typesetting:-mrow(Typesetting:-mi( 

Typesetting:-mfenced(Typesetting:-mrow(Typesetting:-mtable(Typesetting:-mtr(Typesetting:-mtd(Typesetting:-mn( (1.1.10)
 

Вычислим определитель при помощи linarg[det](имя матрицы) . 

Typesetting:-mrow(Typesetting:-mi( 

`+`(`-`(sin(`*`(`^`(lambda, `/`(1, 2)), `*`(l))))) (1.1.11)
 

Для получения всех решений уравнений, содержащих периодические функции, следует присвоить переменной _EnvAllSolutions  значение true. В противном случае, по умолчанию функция solve  выдаст только одно решение. При помощи команды solve решим полученное выражение относительноTypesetting:-mrow(Typesetting:-mo(. 

Typesetting:-mrow(Typesetting:-mi( 

`/`(`*`(`^`(Pi, 2), `*`(`^`(_Z1, 2))), `*`(`^`(l, 2))) (1.1.12)
 

Заменим Typesetting:-mrow(Typesetting:-mi( для удобочитаемости формулы, символ "%" означает предыдущую строку: 

Typesetting:-mrow(Typesetting:-mi( 

`/`(`*`(`^`(Pi, 2), `*`(`^`(k, 2))), `*`(`^`(l, 2))) (1.1.13)
 

Typesetting:-mrow(Typesetting:-mi( 

proc (k) options operator, arrow; `/`(`*`(`^`(Pi, 2), `*`(`^`(k, 2))), `*`(`^`(l, 2))) end proc (1.1.14)
 

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

Typesetting:-mrow(Typesetting:-mi( 

Ограничим значение переменной k и заменим переменную λ в уравнении eq1 на функцию ev(k): 

Typesetting:-mrow(Typesetting:-mi( 

Typesetting:-mrow(Typesetting:-mi( 

diff(diff(X(x), x), x) = `+`(`-`(`/`(`*`(`^`(Pi, 2), `*`(`^`(k, 2), `*`(X(x)))), `*`(`^`(l, 2))))) (1.1.15)
 

Решим уравнение ur при помощи команды dsolve: 

Typesetting:-mrow(Typesetting:-mi( 

X(x) = `*`(_C1, `*`(sin(`/`(`*`(Pi, `*`(k, `*`(x))), `*`(l))))) (1.1.16)
 

Typesetting:-mrow(Typesetting:-mi( 

proc (k, x) options operator, arrow; `*`(_C1, `*`(sin(`/`(`*`(Pi, `*`(k, `*`(x))), `*`(l))))) end proc (1.1.17)
 

Возьмем второе уравнение из уравнения res1: 

Typesetting:-mrow(Typesetting:-mi( 

diff(T(t), t) = `*`(`^`(a, 2), `*`(T(t), `*`(_c[1]))) (1.1.18)
 

Заменим Typesetting:-msub(Typesetting:-mi( на -ev(k) в уравнении eq2 

Typesetting:-mrow(Typesetting:-mi( 

diff(T(t), t) = `+`(`-`(`/`(`*`(`^`(a, 2), `*`(T(t), `*`(`^`(Pi, 2), `*`(`^`(k, 2))))), `*`(`^`(l, 2))))) (1.1.19)
 

Решим уравнение eq2 при помощи команды dsolve: 

Typesetting:-mrow(Typesetting:-mi( 

T(t) = `*`(_C1, `*`(exp(`+`(`-`(`/`(`*`(`^`(a, 2), `*`(`^`(Pi, 2), `*`(`^`(k, 2), `*`(t)))), `*`(`^`(l, 2)))))))) (1.1.20)
 

Поскольку константа _С1 входит в решение только в виде произведений _С1 *_С2, _С1*_С3, можно сократить количество констант присвоив _С1 значение 1. 

Typesetting:-mrow(Typesetting:-mi( 

T(t) = exp(`+`(`-`(`/`(`*`(`^`(a, 2), `*`(`^`(Pi, 2), `*`(`^`(k, 2), `*`(t)))), `*`(`^`(l, 2)))))) (1.1.21)
 

Общее решение уравнения представляет из себя линейную комбинацию всех частных решений. 

Typesetting:-mrow(Typesetting:-mi( 

Typesetting:-mrow(Typesetting:-mi( 

Sum(`*`(C[k], `*`(exp(`+`(`-`(`/`(`*`(`^`(a, 2), `*`(`^`(Pi, 2), `*`(`^`(k, 2), `*`(t)))), `*`(`^`(l, 2)))))), `*`(sin(`/`(`*`(Pi, `*`(k, `*`(x))), `*`(l)))))), k = 1 .. infinity) (1.1.22)
 

Из начального условия найдем неизвестные коэффициенты Typesetting:-mrow(Typesetting:-msub(Typesetting:-mi( 

Получили разложение функции Typesetting:-mrow(Typesetting:-mi( в ряд Фурье по синусам. Вычислим коэффициенты разложения: 

Typesetting:-mrow(Typesetting:-mi( 

Typesetting:-mrow(Typesetting:-mi( 

`+`(`-`(`/`(`*`(4, `*`(`^`(l, 2), `*`(A, `*`(`+`(`^`(-1, k), `-`(1)))))), `*`(`^`(Pi, 3), `*`(`^`(k, 3)))))) (1.1.23)
 

Typesetting:-mrow(Typesetting:-mi( 

Sum(`+`(`-`(`/`(`*`(4, `*`(`^`(l, 2), `*`(A, `*`(`+`(`^`(-1, k), `-`(1)), `*`(exp(`+`(`-`(`/`(`*`(`^`(Pi, 2), `*`(`^`(k, 2), `*`(`^`(a, 2), `*`(t)))), `*`(`^`(l, 2)))))), `*`(sin(`/`(`*`(Pi, `*`(k, `*... (1.1.24)
 

Для визуализации решения достаточно взять конечное число слагаемых в сумме.  

Typesetting:-mrow(Typesetting:-mi( 

Основной и наиболее часто используемой командой двумерной графики является команда plot из ядра Maple. В зависимости от входных параметров она позволяет рисовать графики функций одной переменной, параметрически заданных функций, наборов точек и т.д. Приведем вариант команды plot, который позволяет в одних осях строить графики нескольких функций. Отметим, что аналогично можно использовать все команды двумерной графики, то есть в качестве входного параметра можно использовать множество функций, наборов точек и т.д. В этом случае обращение к команде имеет вид: plot({func1, func2...},x=a..b, y=c..d, <options>). Здесь func1, func2,... выражения, зависящие от переменной x, a..b диапазон изменения переменной x (отрезок оси абсцисс), c..d выводимый интервал по оси ординат. Здесь и далее в угловых скобках указаны аргументы, которые могут отсутствовать. Если одним из концов интервала изменения x является бесконечность, то выводится график асимптотического поведения функции. Построим график функции u(x,t). 

Typesetting:-mrow(Typesetting:-mi( 

Typesetting:-mrow(Typesetting:-mi( 

Typesetting:-mrow(Typesetting:-mi( 

Plot_2d
 

Для того, чтобы построить анимированный график воспользуемся командой animate(F, x=a..b, t=c..d, frame=n) - здесь F - выражение, зависящее от переменных x и t, которые изменяются соответственно в интервалах [a.b] и [c.d]. Переменная x отвечает оси абсцисс, t - переменная времени, а параметр frame задает число кадров.  

Typesetting:-mrow(Typesetting:-mi( 

Plot_2d