Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра автоматизованих систем управління
Звіт
до лабораторної роботи № 7
з курсу «Чисельні методи в інформатиці»
на тему «Методи розв’язування диференційних
рівнянь у частинних похідних»
Львів – 2011
Мета роботи: Засвоїти теоретичний матеріал і методи розв’язування диференційних рівнянь у частинних похідних, набути практичні навики знаходження їхніх наближених значень.
Короткі теоретичні відомості
Із розв’язуванням диференційних рівнянь у частинних похідних інженерам і дослідникам доводиться зустрічатися в багатьох областях науки і техніки, в аеро- і гідродинаміці, ядерній фізиці, радіозв’язку тощо.
Розрізняють три типи диференційних рівнянь другого порядку:
– еліптичні, при B2 − 4AC < 0 ;
– параболічні, при B2 − 4AC = 0;
– гіперболічні, при B2 − 4AC > 0.
Рівняння можуть переходити з одного вигляду до іншого в залежності від значень коефіцієнтів.
Існують два методи розв’язування диференційних рівнянь у частинних похідних: різницевий метод (метод скінченних різниць) і метод скінченних елементів. У сучасній прикладній математиці обидва методи розглядаються як інтерпретації використання загальної теорії різницевих схем до розв’язування диференційних рівнянь у частинних похідних .
В основі методу cкінченних елементів лежить варіаційне числення. Диференційне рівняння, яке описує задачу, та відповідні граничні умови використовують для формулювання варіаційної задачі. В методі скінченних елементів фізична задача замінюється її кусково-гладкою моделлю. Цей метод, незважаючи на те, що він вимагає складної постановки задачі, високої кваліфікації та досвіду користувача, є неуніверсальним (кожний розв’язок застосовується лише для конкретної задачі). Метод скінченних елементів знайшов широке використання для розв’язування спеціальних задач в теоретичній механіці, гідродинаміці, теорії поля, однак, він складний, вимагає серйозної підготовки і знань в конкретній області використання. Тому при розв’язуванні задач автоматики та систем керування частіше використовується різницевий метод.
1. Різницевий метод.
Для числового розв’язування диференційних рівнянь другого порядку в частинних похідних найчастіше використовується двовимірна прямокутна сітка. Центрально-різницеві шаблони, які застосовують на двовимірній квадратній сітці з кроком h , зображеній на рисунку 1 (індекс j надається незалежній змінній y , а i відноситься до x ), можуть бути отримані аналогічно як і в одновимірному випадку.
Рис. 1. Квадратна сітка.
2. Розв’язування різних типів диференційних рівнянь у частинних похідних.
Практичні методи і алгоритми розв’язування різних типів диференційних рівнянь в частинних похідних мають свої особливості і вимагають окремого розгляду на прикладі найбільш розповсюджених задач.
2.1. Еліптичні рівняння.
До еліптичних рівнянь зводиться багато різних фізичних задач: розрахунок напружень, які виникають при пружному скруті довгого циліндричного стрижня; розподіл електричних напруг на площині, що проводить струм; задача про стаціонарні течії тепла в двовимірному тілі.
Розглянемо класичну задачу Діріхле для рівняння Лапласа в прямокутній області, що формулюється таким чином: знайти неперервну функцію f(x,y), яка в прямокутній області Ω = {(x, y) | 0 ≤ x ≤ a, 0 ≤ y ≤ b} задовольняє рівняння Лапласа:
і приймає на границі області задані значення:
x=0; f (0,y) = f1 (y), x=a; f (a,y) = f2 (y), y=0; f (x,0) = f3 (x), y=b; f (x,b) = f4 (x).
Введемо в області розв’язання двовимірну сітку з кроком h по осі x і l по осі y. Тоді, користуючись прийнятими в попередніх розділах позначеннями і апроксимуючи рівняння Лапласа різницевим рівнянням, отримаємо таку систему лінійних рівнянь (приймемо для спрощення l=h):
(2)
при i=1,2,…,n-1; j=1,…,m-1.
Ця система рівнянь має велику кількість нульових елементів і задовольняє умови збіжності при використанні ітераційних методів. Найбільше використання для розв’язання таких систем знайшов метод Гаусса-Зейделя, який, коли застосовується до еліптичних різницевих рівнянь, називається методом Лібмана або методом послідовних зміщень.
Порядок ітерацій можна простежити, переписавши систему (2) у вигляді:
де верхніми індексами позначено порядковий номер ітерації: m – попередня, m+1 – наступна. Зазвичай вважають для всіх i, j. Система рівнянь легко розв’язується на ПЕОМ. Взагалі кажучи, будь-які еліптичні рівняння, які не містять , зводяться до систем різницевих рівнянь, які можна розв’язувати як методом Лібмана, так і іншими ітераційними методами (Якобі, послідовної верхньої релаксації та ін.), оскільки для них виконуються умови збіжності. Для еліптичних рівнянь, які містять , в загальному вигляді, питання про збіжність ітераційних методів не має теоретичного розв’язку і необхідно розглядати отриману систему рівнянь в кожному конкретному випадку.
2.2. Гіперболічні рівняння.
В інженерній практиці найчастіше зустрічається гіперболічне рівняння в частинних похідних – хвильове рівняння, яке описує різні види коливань: коливання струни або мембрани, розповсюдження звукових хвиль у різних середовищах тощо.
В загальному вигляді задача формулюється таким чином: знайти функ-цію f (x, t), яка задовольняє всередині області Ω={(x, t) , 0 ≤ x ≤ a, 0 ≤t ≤ T } рівняння
,
початкові
і граничні умови
Оскільки заміна змінних t =c·t приводить рівняння до вигляду:
то надалі приймаємо с=1.
Переходячи до різницевого рівняння на сітці з кроком h по x й τ по t з центральними різницями, отримаємо
Якщо ввести , то вираз для fi, j +1 прийме вигляд:
fi, j+1 = r² ( fi+1, j + fi−1, j ) + 2(1 − r² ) fi, j − fi, j− 1. (3)
Текст програми:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "RiznUn.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
const n=4,m=4;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float x[n]={0}, y[m]={0}, u[n+1][m+1]={0};
int i,j,m1,n1;
float a,b,hx,hy,s,t,w,r,e;
a=StrToFloat(LabeledEdit1->Text);
b=StrToFloat(LabeledEdit2->Text);
e=StrToFloat(LabeledEdit3->Text);
hx=a/n;
hy=b/m;
t=(hx/hy)*(hx/hy);
for (j=0; j<=m; j++)
{
y[j]=j*hy;
u[0][j]=0;
u[n][j]=y[j];
}
for (i=0; i<=n; i++)
{
x[i]=i*hx;
u[i][0]=0;
u[i][m]=x[i];
}
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
u[i][j]=1;
do
{
w=0;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
{
s=(u[i-1][j]+u[i+1][j]+t*(u[i][j-1]+u[i][j+1]))/(2*(1+t));
r=abs(s-u[i][j]);
if (r>w) w=r;
u[i][j]=s;
}
}
while (w>=e);
StringGrid1->RowCount=n+2;
StringGrid1->ColCount=m+2;
StringGrid1->Cells[0][0]="x\\y";
for (i=0; i<=n; i++)
{
for (j=0; j<=m; j++)
StringGrid1->Cells[j+1][i+1]=FloatToStrF(u[i][j],ffFixed,6,3);
StringGrid1->Cells[0][i+1]=FloatToStrF(x[i],ffFixed,6,3);
}
for (j=0; j<=m; j++) StringGrid1->Cells[j+1][0]=FloatToStrF(y[j],ffFixed,6,3);
}
//---------------------------------------------------------------------------------
Результат виконання програми:
Висновок: На цій лабораторній роботі я засвоїв теоретичний матеріал і методи розв’язування диференційних рівнянь у частинних похідних, набув практичні навики знаходження їхніх наближених значень.