- •Решение краевой задачи для обыкновенного дифференциального уравнения.
- •Содержание:
- •3.2. Описание результатов...................................................................................................11
- •4.2. Описание результатов...................................................................................................15
- •1. Постановка задачи
- •2. Метод сведения краевой задачи к задаче Коши
- •2.1. Описание метода
- •2.2. Описание результатов
- •3. Метод конечных разностей
- •3.1. Описание метода
- •3.2. Описание результатов
- •4. Метод Галёркина
- •4.1. Описание метода
- •4.2. Описание результатов
- •5. Выводы
- •Приложение 1. Листинг программы «Метод сведения краевой задачи к задаче Коши»
- •Приложение 2. Листинг программы «Метод конечных разностей»
- •Приложение 3. Листинг программы «Метод Галёркина»
4.2. Описание результатов
При решении данного дифференциального уравнения второго порядка с заданными краевыми условиями (1.3) методом Галёркина, получены следующие результаты представленные в таблице 3. В столбце Х приведено разбиение отрезка [1.3; 1.8] с шагом h = 0.02, в столбце Y(X) – значение функции (n=1,…,26) в соответствующих точках в столбце E – значения найденных абсолютных погрешностей.
В результате работы программы, листинг которой приведен в приложении 3, точность была достигнута при количестве базисных функций равных 5, максимальная погрешность как видно из таблицы 3 при n=24.
Легко заметить, что полученная максимальная погрешность меньше заданной точности следовательно, проверка точности выполнена и полученная точность удовлетворяет заданной.
Таблица 3
X Y(X) E
1.30 2.200000 0.00e+000
1.32 2.029193 8.78e-007
1.34 1.859826 9.65e-007
1.36 1.692047 6.87e-007
1.38 1.526000 3.23e-007
1.40 1.361814 3.49e-008
1.42 1.199613 1.03e-007
1.44 1.039511 8.21e-008
1.46 0.881613 6.72e-008
1.48 0.726016 2.90e-007
1.50 0.572810 5.25e-007
1.52 0.422076 7.15e-007
1.54 0.273886 8.18e-007
1.56 0.128308 8.13e-007
1.58 -0.014600 7.01e-007
1.60 -0.154786 5.07e-007
1.62 -0.292205 2.77e-007
1.64 -0.426817 6.75e-008
1.66 -0.558591 5.80e-008
1.68 -0.687500 4.71e-008
1.70 -0.813523 1.28e-007
1.72 -0.936644 4.51e-007
1.74 -1.056855 8.38e-007
1.76 -1.174150 1.11e-006
1.78 -1.288530 9.85e-007
1.80 -1.400000 0.00e+000
5. Выводы
Обыкновенное дифференциальное уравнение второго порядка было решено тремя методами: сведением краевой задачи к задаче Коши, методом конечных разностей, методом Галёркина. Для получения решения были написаны программы на языке программирования C++.
Максимальная погрешность в методе сведения краевой задачи к задаче Коши равна , в методе конечных разностей: , в методе Галёркина: .
Требуемая точность E= была достигнута. При использовании методов сведения к задаче Коши и конечных разностей точность достигалась путём уменьшения шага, при использовании метода Галёркина - путём увеличения количества базисных функций.
Приложение 1. Листинг программы «Метод сведения краевой задачи к задаче Коши»
#include "stdafx.h"
#include "math.h"
const int N_max=100;
const double a=1.3, b=1.8, A=2.2, B=-1.4, epsel=0.00001;
double F(double x)
{ return (1.8/(x*x)-4);}
double Q(double x)
{ return (2.3/x);}
double P(double x)
{ return (0.9*x);}
void Runge_Kutt(double h,int n,double U[],double V[],double z[],double t[],double a)
{
double k1z,k2z,k3z,k4z,
k1v,k2v,k3v,k4v,
k1t,k2t,k3t,k4t,
k1u,k2u,k3u,k4u;
double x=a;
z[0]=0;
V[0]=A;
t[0]=1;
U[0]=0;
for(int i=0;i<=n;i++){
x=a+i*h;
k1v=z[i];
k1z=F(x) - P(x)*z[i]-Q(x)*V[i];
k2v=z[i]+h/2*k1z;
k2z=F(x+h/2) - P(x+h/2)*(z[i]+h/2*k1z)-Q(x+h/2)*(V[i]+h/2*k1v);
k3v=z[i]+h/2*k2z;
k3z=F(x+h/2) - P(x+h/2)*(z[i]+h/2*k2z)-Q(x+h/2)*(V[i]+h/2*k2v);
k4v=z[i]+h*k3z;
k4z=F(x+h) - P(x+h)*(z[i]+h*k3z)-Q(x+h)*(V[i]+h*k3v);
k1u=t[i];
k1t=-P(x)*t[i]-Q(x)*U[i];
k2u=t[i]+h/2*k1t;
k2t=-P(x+h/2)*(t[i]+h/2*k1t)-Q(x+h/2)*(U[i]+h/2*k1u);
k3u=t[i]+h/2*k2t;
k3t=-P(x+h/2)*(t[i]+h/2*k2t)-Q(x+h/2)*(U[i]+h/2*k2u);
k4u=t[i]+h*k3t;
k4t=-P(x+h)*(t[i]+h*k3t)-Q(x+h)*(U[i]+h*k3u);
V[i+1]=V[i]+h/6*(k1v+2*k2v+2*k3v+k4v);
z[i+1]=z[i]+h/6*(k1z+2*k2z+2*k3z+k4z);
U[i+1]=U[i]+h/6*(k1u+2*k2u+2*k3u+k4u);
t[i+1]=t[i]+h/6*(k1t+2*k2t+2*k3t+k4t);
}
}
double Proverka_Tochnosti(double y[],double y_tochnoe[],int n,double delta,double eps[])
{
int i=0;
delta=0;
for(i=0;i<=n/2;i++)
{
eps[i]=fabs(y[2*i]-y_tochnoe[i]);
if(eps[i]>delta)
delta=eps[i]; }
return delta;}
void Nahozdenie_y(double y[],double U[],double V[],int n,double C)
{
int i;
for(i=0;i<=n;i++)
y[i]=C*U[i]+V[i];
}
void Prisvoenie_y_Tochnoe(double y[],double y_tochnoe[],double y_vivodimoe[],int n)
{
int i;
for(i=0;i<=n;i++){
y_vivodimoe[i]=y_tochnoe[i];
y_tochnoe[i] = y[i];}
}
void Pechat(double y_vivodimoe[],double a,double eps[],int n,int N,double delta)
{
int i,j=1,k;
double h,x=a;
k=n/N;
h=(b-a)/n;
printf("n = %d\nh = %1.2f\nMax_Delta = %1.2e\n\n",n,h,delta);
printf("\tx\ty\t\tE\n");
for(i=0;i<=n;i+=k)
{
printf("%d)\t%1.2f\t%f\t%1.2e\n",j++,x,y_vivodimoe[i],eps[i]);
x=x+k*h;
}
}
main()
{
int i=0,j=0,N=25,n=0;
double U[N_max],V[N_max],z[N_max],y[N_max],y_tochnoe[N_max],y_vivodimoe[N_max];
double h=0,x=0,delta=0,t[N_max],eps[N_max],C=0;
n=N;
do
{
if(n>=N_max)
{
printf("Vihod za predeli massiva");
return 0;
}
h=(b-a)/n;
Runge_Kutt(h,n,U,V,z,t,a);
C=(B-V[n])/U[n];
Nahozdenie_y(y,U,V,n,C);
delta=Proverka_Tochnosti(y,y_tochnoe,n,delta,eps);
Prisvoenie_y_Tochnoe(y,y_tochnoe,y_vivodimoe,n);
n=2*n;
}
while(delta>epsel);
Pechat(y_vivodimoe,a,eps,n/4,N,delta);
printf("n = %d\nh = %1.2f\nMax_Delta = %1.2e\n\n",n,h,delta);
return 0;}