1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
| // 12.cpp: главный файл проекта.
#include "stdafx.h"
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<iostream>
#define len 50//степень аппроксиамации,размер матрицы& ...;
/*******************************Тестовая функция***************************/
double Tfunc(double a) //Паробола;
{return (a*a);}
/***************************************************************************/
int i,j,k; //для организации циклов;
int n; //степень аппроксимации МНСП;
int m; //Число разбиений ,m+1 число точек на [A,B];
double a[len][len+1]; //решаемая система - расширенная матрица;
double A,B; //орезок-[A,B];
double c0[len]; //массив коэффициентов;
double cnst,h,x;
double Fn(double x,int n);//возращает знач.МНСП в точке X,n-степень апроксимации;
void pogrech(void);
void ipMatr(void); //ввод матрицы;
void opMatr(void); //вывод матрицы;
void main(void)
{double aa,bb;
ipMatr();
for(opMatr(),k=0;k<=n;k++) //прямой ход метода Гаусса;
{for(aa=fabs(a[k][k]),i=k,j=k+1;j<=n;j++)//поиск макс. ел-та;
if(fabs(a[j][k])>aa){i=j;aa=fabs(a[j][k]);};
if(aa<0)
{printf("Система не имеет единственного решения!!!");
getch();
}
for(j=k;(j<=n+1)&&(i!=k);j++) //перестановка i-ой строки;
{bb=a[k][j];
a[k][j]=a[i][j];
a[i][j]=bb;
}
for(aa=a[k][k],a[k][k]=1,j=k+1;j<=n+1;j++)//преобразование ведущей строки;
a[k][j]=a[k][j]/aa;
for(i=k+1;i<=n;i++) //метод Гаусса;
for(bb=a[i][k],a[i][k]=0,j=k+1;(j<=n+1)&&(bb!=0);j++)
a[i][j]=a[i][j]-bb*a[k][j];
}
for(opMatr(),i=n;i>=0;c0[i]=aa,i--) //Обратный ход метода;
for(aa=a[i][n+1],j=n;j>=i+1;j--)
aa=aa-a[i][j]*c0[j];
for(i=0;i<=n;printf("c%d=%10.15lf\n",i,c0[i]),i++);//вывод коэффициентов;
pogrech();
system("PAUSE");
}
void ipMatr(void)
{
setlocale(LC_ALL,"Russian");
printf("Определите степень аппроксимации MNK\n n=");scanf("%d",&n);
printf("Задайте отрезок [A,B]:\n A=");scanf("%lf",&A);
printf(" B=");scanf("%lf",&B);
cnst=B-A;
printf("Введите число разбиений отрезка[A,B](min=1)\n m=");
scanf("%d",&m);
h=cnst/m; //шаг разбиения;
for(i=0;i<=n;i++)
for(j=0;j<=n+1;j++) //формирование a[i][j];
{if(j<=n) a[i][j]=(pow(B,i+j+1)-pow(A,i+j+1))/(cnst*(i+j+1));
else //формирование B[i];
//поиск интеграла на дискретном множеств;
{for(a[i][j]=0,x=A,k=0;(k<=m);k++,x=x+h)//формирование B[i];
{a[i][j]=a[i][j]+Tfunc(x)*pow(x,i);}//сумма;
a[i][j]=(a[i][j])/(m+1); //нормировка;
}
}
}
void opMatr(void)
{for(i=0;i<=n;i++,printf("\n"))
for(j=0;j<=n+1;j++)
{if(j==n+1)printf("=%10.6lf",a[i][j]);else printf(" %10.7lf",a[i][j]); };
printf("\n");
}
double Fn(double x,int n)
{double F=0;
for(i=0;i<=n;i++)
{F=F+c0[i]*pow(x,i);}
return F;
system("PAUSE");
}
void pogrech(void)
{double max,p,ps,del;
max=fabs(Tfunc(A)-Fn(A,n));
ps=pow(max,2);
del=pow(Tfunc(A),2);
for(x=A+h;x<=B;x+=h)
{p=fabs(Tfunc(x)-Fn(x,n));
if(p>max)max=p;
ps=ps+pow(p,2);
del=del+pow(Tfunc(x),2);
}
printf("\Погрешность приближения=%10.10lf\n",sqrt(ps/del));
ps=sqrt(ps/(m+1));
printf("Средняя практическая погрешность=%10.10lf\n",ps);
printf("Maxимальная практическая погрешность=%10.10lf\n",max);
} |