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

#include <stdio.h>

#include <conio.h>

#include <math.h>

#define p(x) (-3*(x))

#define q(x) (-4)

#define r(x) (1)

#define l(x) ( (q(x)*h*h-2)/ (1+p(x)*h/2) )

#define m(x) ( (1-p(x)*h/2)/ (1+p(x)*h/2) )

#define f(x) ( r(x)*h*h / (1+p(x)*h/2) )

#define N 500

#define EPS 0.0001

int n;

double y[N];

double a=1, b=1.6, A=-3, B=-2;

double h=0.06, x;

void raznost (void);

main ()

{

int i, t;

double y1[N], eps[N], max_eps;

for (i=0;i<N;i++) y1[i]=0;

clrscr ();

do

{

for(i=0;i<=n;i++) y1[i]=y[i];

n=(b-a)/h+.5;

if (n>N)

{

printf ("\n Ошибка: выход за пределы массива ");

getch ();

return 0;

}

raznost();

max_eps=0;

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

{

eps[i]=fabs(y[2*i]-y1[i]);

if (eps[i]>max_eps) max_eps=eps[i];

}

h/=2;

}

while (max_eps>EPS);

clrscr ();

printf (" Решение краевой задачи для дифференциального уравнения II порядка с точностью Е = %g методом конечных разностей \n\n",EPS);

printf ("ЙНННННННННННННЛННННННННННННННННННННННЛННННННННННННННННННН»\n");

for (i=0;i<=n/2;i+=(0.06/(h*4)+0.06))

printf ("є x = %.2f є y(x) = %+f є eps = %.1e є\n",a+h*4*i,y1[i],eps[i]);

printf ("ИНННННННННННННКННННННННННННННННННННННКНННННННННННННННННННј\n");

printf ("\n Результаты представлены с шагом 0.06");

printf ("\n ‡ ¤ ­­ п в®з­®бвм %g ¤®бвЁЈ­гв  ЇаЁ и ЈҐ а ў­®¬ %g\n",EPS,h*4);

getch ();

return 0;

}

/****************************************************************************

Функция, вычисляющая корни уравнения II порядка методом конечных разностей.

****************************************************************************/

void raznost (void)

{

int i;

double c[N] , d[N];

y[0]=A;

y[n]=B;

c[0]=A;

d[0]=0;

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

{

x = a + h*i;

c[i]=(f(x)-m(x)*c[i-1])/(l(x)-m(x)*d[i-1]);

d[i]=1/(l(x)-m(x)*d[i-1]);

}

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

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

}

  1. Метод Галеркина.

#include<stdio.h>

#include<math.h>

#include<conio.h>

#define P(x) (-3*(x))

#define Q(x) (-4)

#define R(x) (1)

#define M 11

main()

{

double a=1,b=1.6,A=-3.3,B=-2,eps=0.0001;

double x,y[M][2],u,l,c[M],h,s1,s2,w,norm,n1[M],I[M][M],J[M];

int N=10,Q=10,i,p=0,j,v,s,n=2;

clrscr();

do

{

h=(b-a)/N;n1[0]=0;n1[10]=0;s1=0;s2=0;y[0][p]=A;norm=0;

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

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

{

for(j=1;j<N;j++)

{

x=j*h+a;

u=pow(x-a,i)*(x-b);

l=v*pow(x-a,v-2)*((v-1)*(x-b)+2*(x-a))+

P(x)*(v*pow(x-a,v-1)*(x-b)+pow(x-a,v))+

Q(x)* pow(x-a,v) *(x-b);

if(float(j)/2!=j/2) s1+=u*l;

else s2+=u*l;

}

I[i][v]=h/3*(4*s1+2*s2);

s1=0;s2=0;

}

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

{

for(j=1;j<N;j++)

{

x=j*h+a;

u=pow(x-a,i)*(x-b);

l=P(x)*(B-A)/(b-a)+Q(x)*((A*b-B*a)/(b-a)+(B-A)/(b-a)*x);

if(float(j)/2!=j/2) s1+=u*(R(x)-l);

else s2+=u*(R(x)-l);

}

J[i]=h/3*(4*s1+2*s2);

s1=0;s2=0;

}

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

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

{

w=I[i][s]/I[s][s];

J[i]-=J[s]*w;

for(j=s+1;j<=n;j++) I[i][j]-=I[s][j]*w;

}

c[n]=J[n]/I[n][n];

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

{

c[i]=J[i];

for(j=i+1;j<=n;j++) c[i]-=I[i][j]*c[j];

c[i]/=I[i][i];

}

for(j=1;j<=Q;j++)

{

x=j*(b-a)/Q+a;

y[j][p]=(A*b-B*a)/(b-a)+(B-A)/(b-a)*x;

for(i=1;i<=n;i++) y[j][p]=y[j][p]+c[i]*pow(x-a,i)*(x-b);

}

if(p==0) {p=1;n++;norm=eps+1;continue;}

else

{

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

{

n1[i]=fabs(y[i][0]-y[i][1]);

if(n1[i]>norm) norm=n1[i];

}

for(i=0;i<=Q;i++) y[i][0]=y[i][1];

}

n++;

}

while (norm>eps);

printf ("\n Решение краевой задачи для дифференциального уравнения \n"

" II-го порядка с точностью Е = %g методом конечных разностей \n",eps);

printf ("\nˆ¬Ґп %d га ў­Ґ­Ёп\n",n-1);

printf ("ЙНННННННННННННЛННННННННННННННННННННННЛННННННННННННННННННН»\n");

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

printf ("є x = %.2f є y(x) = %+f є eps = %.1e є\n",i*(b-a)/Q+a,y[i][0],n1[i]);

printf ("ИНННННННННННННКННННННННННННННННННННННКНННННННННННННННННННј\n");

printf ("\n Результаты представлены с шагом 0.06\n");

getch();

return 0;

}