Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
вычмат курсач.doc
Скачиваний:
9
Добавлен:
16.09.2019
Размер:
531.97 Кб
Скачать

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. 1.30 2.200000 0.00e+000

  2. 1.32 2.029193 8.78e-007

  3. 1.34 1.859826 9.65e-007

  4. 1.36 1.692047 6.87e-007

  5. 1.38 1.526000 3.23e-007

  6. 1.40 1.361814 3.49e-008

  7. 1.42 1.199613 1.03e-007

  8. 1.44 1.039511 8.21e-008

  9. 1.46 0.881613 6.72e-008

  10. 1.48 0.726016 2.90e-007

  11. 1.50 0.572810 5.25e-007

  12. 1.52 0.422076 7.15e-007

  13. 1.54 0.273886 8.18e-007

  14. 1.56 0.128308 8.13e-007

  15. 1.58 -0.014600 7.01e-007

  16. 1.60 -0.154786 5.07e-007

  17. 1.62 -0.292205 2.77e-007

  18. 1.64 -0.426817 6.75e-008

  19. 1.66 -0.558591 5.80e-008

  20. 1.68 -0.687500 4.71e-008

  21. 1.70 -0.813523 1.28e-007

  22. 1.72 -0.936644 4.51e-007

  23. 1.74 -1.056855 8.38e-007

  24. 1.76 -1.174150 1.11e-006

  25. 1.78 -1.288530 9.85e-007

  26. 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;}