Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабы / 1-2

.cpp
Скачиваний:
18
Добавлен:
11.06.2015
Размер:
3.23 Кб
Скачать
#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;
}
Соседние файлы в папке лабы