- •Московский авиационный институт
- •II курса группы с-208
- •§ 1. Общая постановка задачи.
- •§ 2. Метод сведения краевой задачи к задаче Коши.
- •§ 3. Метод конечных разностей.
- •§ 4. Метод Галеркина.
- •§ 5. Метод прогонки.
- •§6. Программы.
- •Метод сведения к задаче Коши.
- •Метод конечных разностей.
- •Метод Галеркина.
- •§ 7. Результаты.
- •Метод конечных разностей2:
- •Метод Галеркина.
Метод конечных разностей.
#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];
}
Метод Галеркина.
#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;
}
