Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабы / 1-2
.cpp#include<iostream>
#include <iomanip>
#include <fstream>
#include<conio.h>
#define _USE_MATH_DEFINES
#include<math.h>
using namespace std;
//const double M_PI = atan(1.0)*4.0;
const double a=-1.0, b=1.0;// концы отрезка
const int n=5;// число узлов
double H=(b-a)/n;
double dop= (b-a)/(10*n);
double l[n],k[n],r[n+1],xdop=a;
double s (double x, int j)
{
return (l[j-1]*pow((x-(a+(j-1)*H)),2.0)-k[j-1]*pow((x-(a+(j)*H)),2.0)+r[j-1]) ;
}
double fun (double x)
{ return (2*sin((M_PI*x)/3)+x);
}
int main ()
{
double m[n+1],g[n-1][n-1],F[n+1],F2[n], Xc[n+1],Xp[n];
for (int i = 0; i<n+1;i++)
for (int j = 0; j<n+1;j++)
g[i][j] = 0;
//узловые значения для основной и вспомогательной сетки
F[0]=fun(a);
Xc[0]=a;
for(int i=1;i<n+1;i++)
{ Xc[i]=a+i*H;
F[i]=fun(Xc[i]);
Xp[i-1]=a+(i-0.5)*H;
F2[i-1]=fun(Xp[i-1]);
}
// метод прогонки
// прямой ход
l[0]=-1.0/3.0;
k[0]=(F2[0] - F[0])/(3.0*H)*8;
for(int i=0;i<n-1;i++)
{
l[i+1]=-H/8.0/(3.0/4.0*H+H/8.0*l[i]);
k[i+1]=(F2[i+1]-F2[i]-H/8*k[i])/(3.0/4*H+H/8*l[i]);
}
// обратный ход
m[n]=(F[n] - F2[n-1]-H/8.0*k[n-1])/(H/8.0*l[n-1]+3*H/8.0);
for(int i=n;i>0;i--)
{
m[i-1]=l[i-1]*m[i]+k[i-1];
}
//находим свободный член интерполирующего многочлена
for(int i=0;i<n;i++)
r[i]= F2[i] - m[i+1]*(H/8)+m[i]*(H/8);
for(int i=0;i<n;i++)
{
l[i]=m[i+1]/(2*H);
k[i]=m[i]/(2*H);
}
ofstream fout ("output.csv");
// в полуцелых узлах
cout<< "A="<<a<<"; B="<<b<<"; n="<<n<<endl;
cout << setw(10) << "----x----" << setw(15) << "l" << setw(15) << "k" << setw(15) << "r"<< endl;
cout << setw(10) << a<< setw(15) << l[0] << setw(15) << k[0]<<setw(15) <<r[0] << endl;
for (int i=0; i<n-1; i++)
{//s[i]=(l[i+1]*pow(( A+(i-0.5)*h-(A+i*h) ),2)+k[i+1]*pow(( A+(i-0.5)*h-(A+(i+1)*h) ),2)+r[i+1] );
//cout << setw(10) << Xp[i] << setw(15) << F2[i] << setw(15) << s(Xp[i],i+1)<<setw(15) <<fabs(F2[i]- s(Xp[i],i+1))<<setw(15) <<fabs(F2[i]-s(Xp[i],i+1))/F2[i] << endl;
cout<< setw(10) << Xp[i] << setw(15)<<l[i+1] << setw(15) << k[i+1]<<setw(15) <<r[i+1] << endl;
}
// cout << setw(10) << b<< setw(15) << F[n-1] << setw(15) << s(b,n-1)<<setw(15) <<endl;
fout << setw(10) << "----x----"<<";" << setw(15) << "Funk(0.5)"<<";" << setw(15) << "S"<<";"<< setw(15)<<"xc"<<";"<<"Fc"<<";"<<"Sc"<<";"<<endl;
fout << setw(10) << a<<";"<< setw(15) << F[0]<<";" << setw(15) << s(Xc[0],1)<<";"<<"0"<<endl;
for (int i=1; i<n-1; i++)
{ fout << setw(10) << Xp[i]<<";" << setw(15) << F2[i] <<";"<< setw(15) << s(Xp[i],i+1)<<";"<<Xc[i]<<";"<<F[i]<<";"<<s(Xc[i],i+1)<<endl;
fout<<fixed;
}
fout << setw(10) << b<<";"<< setw(15) << F2[n-1] <<";"<< setw(15) << s(b,n-1)<<endl;
fout<<setw(10) << "l" <<";"<< setw(15) << "k"<<";" << setw(15) << "r"<<";"<<"S(x)-f(x)"<<endl;
for (int i=0; i<n+1; i++)
{
fout<<setw(10) << l[i]<<";"<< setw(15) << k[i]<<";" << setw(15) << r[i]<<";"<<fabs(fun(xdop)- s(xdop,1))<<endl;
xdop+=dop;
}
fout << "S(x)-f(x)"<<endl;
for ( int i=10;i<=100;i++)
{ int c=i/10;
fout << fabs(s(xdop,c) - fun(xdop))<<endl;
xdop+=dop;
}
fout.close();
_getch();
return 0;
}