Тема 2 ЗВЕДЕННЯ РІВНЯНЬ ДРУГОГО ПОРЯДКУ ДО КАНОНІЧНОГО ВИГЛЯДУ ЗА ДОПОМОГОЮ ЗАМІНИ ЗМІННИХ 5 страница
Задовольняємо початкові умови
> U1:=U(x,0);
> f:=x->(x<=0,0,x<=Pi/2,x,x<=Pi,Pi-x,o);
Умови Діріхле для функції виконуються (функція неперервна і кусково-монотонна на проміжку ), тому її можна розкласти в ряд Фур’є.
> U(x,o)=f(x);
> assume(n::posint);
> f1(x):=x;
> f2(x):=Pi-x;
> A[n]:=2/Pi*{int(f1(x)*sin(n*x),x=0..Pi/2)+ +int(f2(x)*sin(n*x),x=Pi/2..Pi)};
> simplify(%);
> d:=combine(%,tgig);
> sin(1/2*Pi*n):=(-1)^n;
> C[n]:=d;
> U1;
- розв’язок рівняння коливання струни, який задовольняє початкові і крайові умови
Зауваження: для парних значень коефіцієнт дорівнює нулю, тому для коефіцієнт розкладу набуде вигляду
, відповідно
- розв’язок рівнянняколивання струни, який задовольняє початкові і крайові умови.
Проаналізуємо одержаний розв’язок, відобразивши його графічно. Оскільки, ряд для функції U(x,t) нескінченний, то для графічного відображення необхідно залишити скінченну кількість доданків. Відповідний вираз визначимо наступним чином (коефіцієнти записані в явному вигляді, N – число доданків в ряді).
> S:=(x,t,N)->sum(2*(2*(-1)^n/n^2)*sin(n*x)/Pi,n=1..N);
Тепер за допомогою процедури animate () відтворимо процес коливання струни (рис.3.1).
> plots[animate](S(x,t,10),x=0..15,t=0..1, numpoints=100, titlefont=[HELVETICA,BOLD,12]);
Приклад 3.3 Знайти закон розподілу температури всередині стержня, розміщеного на відрізку , якщо в початковий момент температура всередині стержня була рівною . На кінцях стержня підтримується нульова температура.
Знайти розв’язок рівняння , яке задовольняє крайові умови , і початкову умову .
Розв’язування
Рівняння, яке розглядається, є рівнянням гіперболічного типу. Подібні задачі виникають при описування процесу поширення хвиль. Функція u(x,t) визначає відхилення точки струни з координатою х в момент часу t. Нульові початкові умови відповідають ситуації, коли кінці струни закріплені. Відповідне хвильове рівняння (а – параметр задачі) має наступний вигляд.
> Eq:=diff(u(x,t),t)=a^2*diff(u(x,t),x$2);
> Eq;
> a:=1;Eq;
Розв’язок рівняння будемо шукати у вигляді ряду за власними функціями.
> U:=(x,t)->Sum(A[n]*(exp((-1)*a^2*(Pi*n/l)^2*t))*sin(Pi*n*x/l) ,n=1..infinity);
> a:=1;
> U(x,t);
> U1:=U(x,0);
Невідомі коефіцієнти розкладу А[n] знаходяться із початкової умови. Відповідно до умови задачі, в початковий момент профіль струни визначається наступною функцією.
> f:=x->(x<=0,0,x<=l/2,x,x<=l,l-x,o);
> U(x,o)=f(x);
> assume(n::posint);
> f1(x):=x;
> f2(x):=l-x;
> A1[n]:=2/l*{int(f1(x)*sin(Pi*n*x/l),x=0..l/2)};
> A2[n]:=2/l*{int(f2(x)*sin(Pi*n*x/l),x=l/2..l)};
> sin(1/2*Pi*n):=(-1)^n;
> A1[n];A2[n];
> A[n]:=4*l/(Pi^2*n^2)*sin(Pi*n/2);
> U(x,t);
-розв’язок рівняння теплопровідності, який задовольняє початкові і крайові умови.
> S:=(x,l,N)->sum(4*sin(Pi*n*x/l)*l*(-1)^n/Pi^2*n^2,n=1..N);
Оскільки, ряд для функції u(x,t) нескінченний, то його необхідно обмежити – необхідно залишити скінченну кількість доданків.
Тепер за допомогою процедури animate () відтворимо процес коливання струни (рис.3.2-3.6).
> plots[animate](S(x,l,5),x=0..100,l=1..5,view=-100..100, numpoints=100,titlefont=[HELVETICA,BOLD,12]);
Момент часу
t=0 c.
Момент часу
t=1 c.
Момент часу
t=5 c.
Момент часу
t=10 c.
Момент часу
t=14 c.
Приклад 3.4 Розв’язати задачу про коливання прямокутної мембрани:
Розв’язування
>Еqn:=diff(u(x,y,t),t$2)=a^2*(diff(u(x,y,t),x$2)+ +diff(u(x,y,t), y$2));
> f:=(x,y)->A*x*y*(l-x)*(L-y);
> pdsolve(Eqn,HINT=X(x)*Y(y)*T(t));
> dsolve({diff(X(x),`$`(x,2))=-lambda^2*X(x),X(0)=0},X(x));
> _EnvAllSolutions:=true;
> solve(sin(lambda*l)=0,lambda);
> about(_Z1);
Originally _Z1, renamed _Z1~:
is assumed to be: integer
> nu:=n->Pi*n/l;
> mu:=n->Pi*n/L;
> X:=(x,n)->sin(x*nu(n));
> Y:=(y,m)->sin(y*mu(m));
>dsolve({diff(T(t),`$`(t,2))=a^2*_c[l]*T(t)+ +a^2*_c[2]*T(t),D(T)(0)=0},T(t));
> T:=(t,n,m)->cos(a*t*sqrt(nu(n)^2+mu(m)^2));
>S:=(x,y,t,N,M)->Sum(Sum(U(n,m)*X(x,n)*Y(y,m)*T(t,n,m), n=1..N),m=1..M);
> u:=(x,y,t)->S(x,y,t,infinity,infinity);
> u(x,y,t);
> u(x,y,0);
`
> assume(n::posint,m::posint);
>U:=(n,m)->int(int(f(x,y)*X(x,n)*Y(y,m),y=0..L), x=0..l)/int(int(X(x,n)^2*Y(y,m)^2,y=0..L),x=0..l);
> u(x,y,t);
Щоб уявити, як буде коливатися мембрана, створимо анімаційну картинку. Але перш за все присвоїмо числові значення параметрам.
> a:=1;
> l:=1;
> L:=1;
> A:=1;
Створюємо анімацію ( в сумі для функції залишаємо 10 доданків по кожному із індексів сумування – всього 100) за допомогою процедури animate3d трьохмірної графіки із пакета plots (рис.3.7-3.9).
>plots[animate3d](S(x,y,t,10,10),x=0..1,y=0..1,t=0..sqrt(2), axes=FRAME,style=HIDDEN,color=BLACK,orientation=[50,60]);
Коливання квадратної мембрани. Момент часу t=1 c.
Коливання квадратної мембрани. Момент часу t=3 c.
Коливання квадратної мембрани. Момент часу t=4 c.
Приклад 3.5 Розв’язати задачу про коливання круглої мембрани: , ,
.
Розв’язування
Ця задача, в порівнянні з попередньою, має дві принципові особливості. По перше, шукана функція залежить тільки від двох змінних – часу t і відстані до центру мембрани . Тому для розв’язування задачі необхідно перейти до полярної системи координат (в цій системі координат незалежними змінними є відстань до центра і кут повороту , але від нього шукана функція не залежить. По друге, всі початкові умови задачі нульові, а граничні умови не стаціонарні (залежать від часу). Тому необхідно змінити алгоритм пошуку розв’язування.
Запишемо оператор Лапласа в полярній системі координат (в декартовій він має вигляд ) врахувавши, що функція на яку він діє залежить тільки від і не залежить від . В цьому випадку корисна процедура dchange().
> PDEtools[dchange]({x=rho*cos(phi),y=rho*sin(phi)},
diff(z(sqrt(x^2+y^2)),x$2)+diff(z(sqrt(x^2+y^2)), y$2),{phi,rho});
Одержаний вираз необхідно спростити.
> simplify(%,symbolic);
Тепер можна записати рівняння.
> Eqn:=diff(u(rho,t),t$2)=a^2*(1/rho)*diff(rho*diff(u(rho, t),rho),rho);
Крім того, задамо функціональну залежність, відповідно до якої відбувається рух країв мембрани.
> f:=t->A*sin(omega*t);
Спочатку знайдемо розв’язок, який буде задовольняти нестаціонарні граничні умови. Розв’язок будемо шукати методом розділення змінних.
> pdsolve(Eqn,HINT=F(rho)*f(t));
Функція має задовольняти такі умови: , щоб забезпечити потрібний закон руху границі мембрани, і, крім того, вона повинна бути обмеженою нулі (F(0)<>infinity).
> dsolve({diff(F(rho),`$`(rho,2))=-F(rho)*omega^2*rho+
+a^2*diff(F(rho),rho))/a^2/rho,F(L)=1,F(0)<>infinity}, F(rho));
> F:=unapply(rhs(%),rho);
Тепер в початковому рівнянні перейдемо до функції , яка пов’язана з початковою функцією співвідношенням , і одержимо наступне.
> Eqn2:=subs(u(rho,t)=v(rho,t)+F(rho)*f(t),Eqn);
Дане рівняння спрощуємо.
> Eqn2:=simplify(Eqn2);
> Eqn2:=lhs(Eqn2)-rhs(Eqn2)=0;
> Eqn2:=simplify(Eqn2);
Розв’язуємо рівняння методом розділення змінних.
> pdsolve(Eqn,HINT=R(rho)*T(t));
Оскільки функція обмежена в нулі, то одержимо.
> dsolve({diff(R(rho),`$`(rho,2))=R(rho)*(-lambda^2)-diff(R(rho),rho)/rho,R(0)<>infinity},R(rho));
Параметр має бути таким, щоб автоматично виконувались граничні умови для функції . Ці умови нульові. Звідси одержимо задачу на власні значення.
> solve(BesselJ(0,lambda*L)=0,lambda);
RootOf(BesselJ(0,_ZL))
Поданий в області вводу результат означає, що власні значення даної задачі одержуються шляхом ділення на L нульової функції Бесселя (маються на увазі розв’язки рівняння ).
В Maple є процедура BesselJZeros(), яка дозволяє обчислити значення аргументу, при яких функція Бесселя перетворюється в нуль. Її перший аргумент – індекс функції Бесселя, другий – індекс кореня. Визначимо функціюmu()
> mu:=n->BesselJZeros(0,n);
BesselJZeros
Власні функції будуть мати наступну структуру.
> R:=(rho,n)->BesselJ(0,rho*mu(n)/L);
BesselJ
Очевидно, що початковий профіль функції співпадає з профілем (оскільки f(0)=0).
> solve(u(rho,0)=v(rho,0)+F(rho)*f(0),v(rho,0));
Оскільки, це значення нульове за умовою задачі, то такою ж має бути умова і для функції T(t), яку визначаємо на даному етапі розв’язування.
> dsolve({diff(T(t),`$`(t,2))=T(t)*a^2*(-lambda^2),T(0)=0}, T(t));
Параметр lambda повинен співпадати з одним із власних значень, які були знайдені вище.
> T:=(t,n)->sin(a*t*mu(n)/L);
Розв’язок для функції v(rho,t) шукаємо у вигляду ряду за власними функціями.
> v:=(rho,t)->Sum(B(n)*R(rho,n)*T(t,n),n=1..infinity);
> v(rho,t);
Коефіцієнти B(n) визначимо, використовуючи початкові умови для похідної по часу від функції v(rho,t).
> F(rho)*D(f)(0);
> Vt0:=-%;
Визначимо процедуру обчислення похідної по часу від функції v(rho,t), яка подана у вигляді ряду за функціями Бесселя. Процедуру визначаємо так, щоб можна було обчислити значення цієї похідної в точці.
> Vt:=proc(rho,t)
> local s;
> diff(v(rho,s),s);
> simplify(subs(s=t,%));
> end proc:
В рамках процедури тимчасова змінна замінюється локальною, за цією змінною обчислюється похідна, потім в одержаному виразі локальна змінна замінюється на аргумент, який вказаний другим під час виклику процедури, і після цього вираз спрощується.
> Vt(rho,t);
> Vt(rho,0);
> eqn:=B(n)*a*BesselJZeros(0,n)=int(Vt0*rho*BesselJ(0,
rho*BesselJZeros(0,n)/L),rho=0..L)/int(rho*BesselJ(0, rho*BesselJZeros(0,n)/L)^2,rho=0..L);
> B:=unapply(solve(eqn,B(n)),n);
> u:=(rho,t)->v(rho,t)+F(rho)*f(t);
Таким чином, розв’язок задачі має наступний вигляд.
> u(rho,t);
Далі присвоюємо числові значення параметрам і створюємо анімаційну картинку.
> A:=1;
> a:=1;
> omega:=2*Pi;
> L:=1;
Однак, необхідно спочатку перевизначити деякі залежності. Так, при обчисленні коефіцієнтів B(n) інтеграл будемо обчислювати наближено, для чого введемо нові коефіцієнти.
> C:=n->evalf(B(n));
Сам нескінченний ряд обриваємо на доданку з номером N і замінюємо коефіцієнти B(n) на C(n).
> U:=(rho,t,N)->sum(C(n)*R(rho,n)*T(t,n),n=1..N)+F(rho)*f(t);
Наприклад, так виглядає наша числова функція при врахуванні тільки трьох доданків в ряді.
> U(rho,t,3);