Численные методы решения краевых задач для дифференциальных уравнений

Характеристика решения первой краевой задачи конечно-разностным и методом прогонки. Их особенности, описание и специфика применения к конкретному случаю. Код программы решения вышеперечисленных методов на языке программирования Borland C++ Builder 6.

Рубрика Математика
Вид курсовая работа
Язык русский
Дата добавления 01.12.2009
Размер файла 53,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

13

Введение

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

Также данная курсовая работа включает в себя: описание метода, применение метода к конкретной задаче (анализ), код программы решения вышеперечисленных методов на языке программирования Borland C++ Builder 6.

Описание метода

Наша задача состоит в том, чтобы рассмотреть и реализовать в программном виде методы решения первой краевой задачи конечно-разностным методом и методом прогонки.

Краевая задача состоит в том, что в её случае известны значения функции и ее производных в более чем одной точке, например, в начальный и конечный момент времени, и необходимо найти частное решение дифференциального уравнения между этими точками. Сами дополнительные условия в этом случае называются краевыми (граничными) условиями. Естественно, что краевая задача может решаться для ОДУ не ниже 2-го порядка.

Теперь отдельно по каждому методу.

1. Конечно-разностный метод.

Сначала рассмотрим конечно-разностный метод решения краевой задачи.

Пусть дано уравнение вида

y''=b(x)y'(x)+c(x)y(x)+d(x) (1)

определенного не отрезке x [a,b], граничные условия y(a)= , y(a)= (2). Форма разделения из [a,b] используется в точках a=x0 < x1< … < xn =b, с шагом h=(b-a)/n и xk =a+kh, k=0,1,…,n.

Разностная схема данного дифференциального уравнения

(3)

(4)

Стартовые производные y(xk) мы заменяем на yk , в результате получаем отношение:

(5)

На следующем шаге мы избавляемся от O(h?) в (5) и вводим , и ; получаем дифференциальное уравнение:

, (6)

которое считает числовую аппроксимацию для дифференциального уравнения (1).

Преобразуем (6) следующим образом:

(7)

где k=1,2,…,n-1, y0 = , yn = .

Запишем (7) в матричном виде

где , .

2. Метод прогонки.

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

Также рассмотрим уравнение (1) на отрезке x[0,1] с граничным условием y(0)= , y(1)= (для 1-й краевой задачи).

Разностная схема данного дифференциального уравнения

(8)

преобразуем (8) следующим образом

(9)

то есть приводится (9) к виду

Ak yk-1 - Ck yk + Bk yk+1 = -fk (10)

(11)

(12)

Для 1-й краевой задачи ; .

Мы будем использовать решение из (10)-(12) в форме

(13)

где , .

Применение метода к конкретной задаче (анализ)

Дано дифференциальное уравнение вида 4xy'' + 2y' + y = 0 (14) , y(1)=1.3817 , x[1,2]. Точное решение этого уравнения имеет вид .

Задача состоит в том, чтобы решить это дифференциальное уравнение, используя краевую задачу конечно-разностным методом и методом прогонки.

В случае конечно-разностного метода уравнение (14) с помощью преобразований, описанных выше приводим у виду

и решаем эту систему рассмотренным ранее методом Гаусса.

Теперь рассмотрим метод прогонки.

Уравнение (14) запишем в виде , преобразуем его к виду , где Ak = , Bk =, C==>

Ak yk-1 - Ck yk + Bk yk+1=0 и, используя уравнение (13) находим решение дифференциального уравнения.

Листинг программы:

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "UBound.h"

#include <math.h>

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int n=10;

int x1=1,x2=2;

double h=(x2-x1)/(double)n;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

double ex_sol(double x)

{

return sin(sqrt(x))+cos(sqrt(x));

}

void __fastcall TForm1::Button_BashClick(TObject *Sender)

{

Label_TypeMethod->Caption="Конечно-разностный";

double x,s,p,q,par_1,par_n;

int i,j,i1,j1;

double A[100][100];

double y[100];

x=x1+h;

par_1=(h/2.0*(-1.0/(2.0*(x)))+1)*ex_sol(1);

par_n=(-h/2.0*(-1.0/(2.0*(2-2*h)))+1)*ex_sol(2);

for(i=0;i<n-1;i++)

{

q=(-1.0/(4.0*x));

p=(-1.0/(2.0*x));

for(j=0;j<n-1;j++)

{

if(i==j)

{

A[i][j]=(2+h*h*q);

}

else

{

if(j==(i+1))

{

A[i][j]=(h*p/2-1);

}

else

{

if(i==j+1)

A[i][j]=(-h*p/2-1);

else

A[i][j]=0;

}

}

}

if(i==0)

{

A[i][j]=par_1;

}

else

{

if(i==n-2)

A[i][j]=par_n;

else

A[i][j]=0;

}

x=x+h;

}

for(i=0;i<n-1;i++)

{

j=i;

s=A[i][j];

for(j=i;j<=n-1;j++)

{

A[i][j]=A[i][j]/s;

}

for(i1=i+1;i1<n-1;i1++)

{

s=A[i1][i];

for(j1=i;j1<n;j1++)

A[i1][j1]=A[i1][j1]-(A[i][j1]*s);

}

}

y[n-2]=A[n-2][n-1]/A[n-2][n-2];

for(i=n-3;i>=0;i--)

{

s=A[i][n-1];

for(j=i+1;j<=n-2;j++)

{

s=s-A[i][j]*y[j];

}

y[i]=s/A[i][i];

}

x=x1+h;

for (int m = 0; m < n-1; m++)

{

StringGrid1->Cells[0][m]=FloatToStr(x);

StringGrid1->Cells[1][m]=FloatToStr(y[m]);

StringGrid1->Cells[2][m]=FloatToStr(ex_sol(x));

StringGrid1->Cells[3][m]=FloatToStr(fabs(y[m]-ex_sol(x)));

x=x+h;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button_ExitClick(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button_MolClick(TObject *Sender)

{

Label_TypeMethod->Caption="Метод прогонки";

double x;

int i;

i = 0;

double alfa[100];

double beta[100];

double A,B,C,F;

alfa[0] = 0;

beta[0] = 1.38177;

x=x1;

for (i = 0; i < n - 1; i++)

{

x = x + h;

A=-h/2.0*(-1.0/(2.0*x))-1.0;

B=h/2.0*(-1.0/(2.0*x))-1.0;

C=-2.0-h*h*(-1.0/(4.0*x));

F=0;

alfa[i+1]=B/(C-alfa[i]*A);

beta[i+1]=(F+beta[i]*A)/(C-alfa[i]*A);

}

double y[100];

y[0] = ex_sol(x2);

x = x1+h;

for (i = 1; i < n; i++)

{

y[i] = alfa[n - i] * y[i - 1] + beta[n - i];

}

for (i = 0; i <=n; i++)

{

StringGrid1->Cells[0][i]=FloatToStr(x);

StringGrid1->Cells[1][i]=FloatToStr(y[n-i-1]);

StringGrid1->Cells[2][i]=FloatToStr(ex_sol(x));

StringGrid1->Cells[3][i]=FloatToStr(fabs(y[n-i-1]-ex_sol(x)));

x=x+h;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton1Click(TObject *Sender)

{

Button_Bash->Visible=true;

Button_Mol->Visible=false;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton2Click(TObject *Sender)

{

Button_Bash->Visible=false;

Button_Mol->Visible=true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button_ExitClick(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button_MolClick(TObject *Sender)

{

Label_TypeMethod->Caption="Метод прогонки";

double x;

int i;

i = 0;

double alfa[100];

double beta[100];

double A,B,C,F;

alfa[0] = 0;

beta[0] = 1.38177;

x=x1;

for (i = 0; i < n - 1; i++)

{

x = x + h;

A=-h/2.0*(-1.0/(2.0*x))-1.0;

B=h/2.0*(-1.0/(2.0*x))-1.0;

C=-2.0-h*h*(-1.0/(4.0*x));

F=0;

alfa[i+1]=B/(C-alfa[i]*A);

beta[i+1]=(F+beta[i]*A)/(C-alfa[i]*A);

}

double y[100];

y[0] = ex_sol(x2);

x = x1+h;

for (i = 1; i < n; i++)

{

y[i] = alfa[n - i] * y[i - 1] + beta[n - i];

}

for (i = 0; i <=n; i++)

{

StringGrid1->Cells[0][i]=FloatToStr(x);

StringGrid1->Cells[1][i]=FloatToStr(y[n-i-1]);

StringGrid1->Cells[2][i]=FloatToStr(ex_sol(x));

StringGrid1->Cells[3][i]=FloatToStr(fabs(y[n-i-1]-ex_sol(x)));

x=x+h;

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton1Click(TObject *Sender)

{

Button_Bash->Visible=true;

Button_Mol->Visible=false;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton2Click(TObject *Sender)

{

Button_Bash->Visible=false;

Button_Mol->Visible=true;

}

//---------------------------------------------------------------------------

Результаты расчета:

1. Конечно - разностный метод

x

exact solution

y

error

1,1

1,36543385512386

1,3655241231777

9,02680538475652E-5

1,2

1,3467827931773

1,34696264285001

0,0001798496727159

1,3

1,32614183910416

1,32640987061151

0,000268031507356567

1,4

1,30377563353274

1,32640987061151

0,000354381017934105

1,5

1,27990532272839

1,28034396043135

0,000438637702957411

1,6

1,25471820307239

1,25523885241359

0,000520649341198885

1,7

1,2283747392501

1,2289750725619

0,000600333311800857

1,8

1,20101378595756

1,20169143839785

0,000677652440289624

1,9

1,17275654886199

1,17350914840487

0,000752599542883688

2. Метод прогонки

x

exact solution

y

error

1,1

1,36543385512386

1,36542117841512

1,26767087399772E-5

1,2

1,3467827931773

1,34676470183753

1,80913397702582E-5

1,3

1,32614183910416

1,32612121470833

2,06243958234906E-5

1,4

1,30377563353274

1,303754611594

2,10219387379395E-5

1,5

1,27990532272839

1,27988551277913

1,98099492652827E-5

1,6

1,25471820307239

1,25470083439625

1,73686761431049E-5

1,7

1,2283747392501

1,22836076021839

1,39790317067597E-5

1,8

1,20101378595756

1,20100393346566

9,8524918956545E-6

1,9

1,17275654886199

1,17275139794799

5,15091399884513E-6


Подобные документы

  • Использование метода конечных разностей для решения краевой задачи уравнений с частными производными эллиптического типа. Графическое определение распространения тепла методом конечно-разностных аппроксимаций производных с применением пакета Mathlab.

    курсовая работа [1,0 M], добавлен 06.07.2011

  • Методы решения систем линейных алгебраических уравнений (СЛАУ): Гаусса и Холецкого, их применение к конкретной задаче. Код программы решения перечисленных методов на языке программирования Borland C++ Builder 6. Понятие точного метода решения СЛАУ.

    реферат [58,5 K], добавлен 24.11.2009

  • Определение дифференциальных уравнений в частных производных параболического типа. Приведение уравнения второго порядка к каноническому виду. Принцип построения разностных схем. Конечно-разностный метод решения задач. Двусторонний метод аппроксимации.

    дипломная работа [603,8 K], добавлен 24.01.2013

  • Изучение численных методов приближенного решения нелинейных систем уравнений. Составление на базе вычислительных схем алгоритмов; программ на алгоритмическом языке Фортран - IV. Приобретение практических навыков отладки и решения задач с помощью ЭВМ.

    методичка [150,8 K], добавлен 27.11.2009

  • Общая характеристика параболических дифференциальных уравнений на примере уравнения теплопроводности. Основные определения и конечно-разностные схемы. Решение дифференциальных уравнений параболического типа методом сеток или методом конечных разностей.

    контрольная работа [835,6 K], добавлен 27.04.2011

  • Последовательность решения линейной краевой задачи. Особенности метода прогонки. Алгоритм метода конечных разностей: построение сетки в заданной области, замена дифференциального оператора. Решение СЛАУ методом Гаусса, конечно-разностные уравнения.

    контрольная работа [366,5 K], добавлен 28.07.2013

  • Методы оценки погрешности интерполирования. Интерполирование алгебраическими многочленами. Построение алгебраических многочленов наилучшего среднеквадратичного приближения. Численные методы решения задачи Коши для обыкновенных дифференциальных уравнений.

    лабораторная работа [265,6 K], добавлен 14.08.2010

  • Общая постановка задачи решения обыкновенных дифференциальных уравнений, особенности использования метода Адамса в данном процессе. Решение системы обыкновенных дифференциальных уравнений методом Адамса и точным методом, сравнение полученных результатов.

    курсовая работа [673,6 K], добавлен 27.04.2011

  • Понятия и термины вариационного исчисления. Понятие функционала, его первой вариации. Задачи, приводящие к экстремуму функционала, условия его минимума. Прямые методы вариационного исчисления. Практическое применение метода Ритца для решения задач.

    курсовая работа [1,3 M], добавлен 08.04.2015

  • Метод Эйлера: сущность и основное содержание, принципы и направления практического применения, определение погрешности. Примеры решения задачи в Excel. Метод разложения решения в степенной ряд. Понятие и погрешность, решение с помощью метода Пикара.

    контрольная работа [129,0 K], добавлен 13.03.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.