Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая Числовые методы Черников СО-201С.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
178.83 Кб
Скачать

3.2. Полученные результаты

С помощью работы программы, листинг которой приведен в приложении 1, точность была достигнута при шаге h=0.02, количество разбиений отрезка [1.4; 1.8] равно 20, максимальная погрешность равна 7.5e-005, что меньше заданной точности, следовательно, проверка точности выполнена и полученная точность удовлетворяет заданной, задача выполнена.

При решении данного дифференциального уравнения второго порядка с заданными краевыми условиями (1.3) методом конечных разностей, получены следующие результаты представленные в таблице 2.

Таблица 2.

X

Y(x)

R

1.40

-3.000000

0.0e+000

1.42

-2.387610

2.4e-005

1.44

-1.839128

4.2e-005

1.46

-1.348638

5.6e-005

1.48

-0.910685

6.6e-005

1.50

-0.520247

7.2e-005

1.52

-0.172710

7.5e-005

1.54

0.136157

7.5e-005

1.56

0.410225

7.4e-005

1.58

0.653029

7.1e-005

1.60

0.867793

6.7e-005

1.62

1.057448

6.1e-005

1.64

1.224658

5.5e-005

1.66

1.371835

4.9e-005

1.68

1.501164

4.2e-005

1.70

1.614617

3.5e-005

1.72

1.713970

2.8e-005

1.74

1.800822

2.0e-005

1.76

1.876609

1.3e-005

1.78

1.942618

6.6e-006

1.80

2.000000

0.0e+000







В столбце Х приведено разбиение отрезка [1.4;1.8 ] с шагом h = 0.02, в столбце Y(X) – значение функции (n=0,…,20) в соответствующих точках , в столбце R - значения найденных абсолютных погрешностей.

Для достижения заданной точности Е = 1.e-4 шаг h = 0.02 не уменьшали, поскольку при шаге меньшем, чем h = 0.02 полученная точность не удовлетворяла заданной.

4. Выводы

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

Сравнивая полученные результаты, мы видим, что результаты отличаются не более чем 9.е-005, что ещё раз доказывает, что задача решена и достигнута заданная точность для обеих методов решения данного дифференциального уравнения.

Приложения Приложение 1. Листинг программы «Метод сведения краевой задачи к задаче Коши»

#include "stdafx.h"

#include "stdio.h"

#include "math.h"

const int N_max=100;

const double a=1.4, b=1.8, A=-3, B=2, epsel=0.0001;

double F(double x)

{ return -1.9;}

double Q(double x)

{ return -0.6/x*x;}

double P(double x)

{ return 3.8*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=0;

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

{y[i]=C*U[i]+V[i];}

}

void Prisvoenie_y_Tochnoe(double y[],double y_tochnoe[],int n)

{

int i=0;

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

{y_tochnoe[i] = y[i];}

}

void Pechat(double y_tochnoe[],double a,double eps[],int n,int N,double h,double h1,double delta)

{

int i=0,j=0;

double x=a;

printf("n = %d\nh = %1.2f\nMax_Delta = %1.2e\n\n",n/2,h1,delta);

printf("\tX\tY(X)\t\tDelta\n");

for(i=0;i<=n/2;i=i+n/2/N)

{

x=a+j*h;

j++;

printf("\t%1.2f\t%f\t%1.2e\n",x,y_tochnoe[i],eps[i/2]);

}

getchar();

}

int main()

{

int i=0,j=0,N=20,n=0;

double U[N_max],V[N_max],z[N_max],y[N_max],y_tochnoe[N_max],t[N_max],eps[N_max],C=0;

double h=0,x=0,delta=0;

n=N;

do

{

if(n>=N_max)

{

printf("Error!!! 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,n);

n=2*n;

}while(delta>epsel);

Pechat(y_tochnoe,a,eps,n,N,0.02,h,delta);

return 0;}

Приложение 2. Листинг программы «Метод конечных разностей»

#include "stdafx.h"

#include "stdio.h"

#include "math.h"

double P(double x){return 3.8*x;}

double Q(double x){return -0.6/x*x;}

double F(double x){return -1.9;}

double h=0.02;

const double EPS=0.0001;

const double a=1.4, A=-3, b=1.8, B=2;

const double alfa1=1;

const double betta1=1;

double x;

const int N=1000;

double y[N],ypred[N],R[N],max_R;

int i,n,k;

void raznost();

int main()

{

n=10;

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

y[i]=0;

do

{

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

ypred[i]=y[i];

n=2*n;

if (n>N)

{

printf ("\nVyhod za predely massiva \n");

return 0;

}

h=(b-a)/n;

raznost ();

max_R=0;

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

{

R[i]=fabs(y[2*i]-ypred[i]);

if (R[i]>max_R) max_R=R[i];

}

}

while (max_R>EPS);

printf ("\n");

printf (" x y(x) R \n");

printf (" \n");

n=n/2;

h=(b-a)/n;

k=n/20;

x=a;

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

{

printf(" %.2f %.6f %.1e \n",x,

ypred[i],R[i]);

x=x+h*k;

}

printf("\n\tZadannaya tochnost EPS=%g dostignuta pri shage ravnom = %.1e\n",EPS,h);

printf ("\n\tKolichestvo otrezkov razbieniya n = %d \n",n);

printf ("\n\tMAX R = %.1e \n\n ",max_R);

return 0;

}

void raznost ()

{

int i;

double c[N],d[N],x, L, M, K;

c[0]=A;

d[0]=0;

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

{

x = a + h*i;

K=(1/(h*h))+(P(x)/(2*h));

M=Q(x)-(2/(h*h));

L=(1/(h*h))-(P(x)/(2*h));

c[i]=(F(x) - L*c[i-1])/(M - L*d[i-1]);

d[i]=K/(M - L*d[i-1]);

}

y[n]=B;

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

y[i]=c[i]-d[i]*y[i+1];

}