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

лабы / 3

.cpp
Скачиваний:
14
Добавлен:
11.06.2015
Размер:
3.91 Кб
Скачать
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <cmath>
#include <fstream>
using namespace std;


ofstream out;

int r=5,t=14,n=10;
double A=1.0,B=2.0,e=pow(10.0,-3.0);


void Progon(double *a, double *b, double *c, double *d, double *m, int N)
{
	double *l, *k;
	l=new double[N];
	k=new double[N];
	
	int i;
	l[0]=-c[0]/b[0];
	k[0]=d[0]/b[0];
	for(i=1;i<=N-1;i++)
	{
		l[i]=-c[i]/(a[i]*l[i-1]+b[i]);
		k[i]=(d[i]-a[i]*k[i-1])/(a[i]*l[i-1]+b[i]);
	}
	m[N]=(d[N]-a[N]*k[N-1])/(a[N]*l[N-1]+b[N]);
	for(i=N-1;i>=0;i--)
		m[i]=l[i]*m[i+1]+k[i];
	delete [] k;
	delete [] l;
}
double U(double x)
{
	return (1/x);
}
double dU(double x)
{
	return (-1/pow(x,2));
}
double f(double x)	
{
	return (1/x+2/pow(x,2)+2/pow(x,3));
}
double p(double x)
{
	return -2;
}
double q(double x)
{
	return -1;
}

void dY(double *y, double *dy, int n, double h)
{
	int i;
	dy[0]=(-3.0*y[0]+4.0*y[1]-y[2])/(2.0*h);
		for(i=1;i<n;i++)
		dy[i]=(y[i+1]-y[i-1])/(2.0*h);
	dy[n]=(y[n-2]-4.0*y[n-1]+3.0*y[n])/(2.0*h);
}
double norm1(double *a,  int n)
{//сумма модулей / n
	double norma=0;
	int i;
	for(i=0;i<=n;i++)
		norma+=fabs(a[i]);
	norma/=n;
	return norma;
}
double norm2(double *a, int n)
{//корень из суммы квадратов / корень из n
	int i;
	double norma=0;
	for(i=0;i<=n;i++)
		norma+=pow(a[i],2.0);
	norma/=n;
	norma=sqrt(norma);
	return norma;
}
double norm3(double *a, int n)
{//наибольший по модулю элемент
	int i;
	double norma;
	norma=fabs(a[0]);
	for(i=1;i<=n;i++)
		if(norma<fabs(a[i]))
			norma=fabs(a[i]);
	return norma;
}
double max(double *a, int n)
{double n1=norm1(a,n),n2=norm2(a,n),n3=norm3(a,n);
	
	if(n2>n1)
		n1=n2;
	if(n3>n1)
		n1=n3;
	return n1;
}

void main()
{locale loc("rus_rus.866"); wcout.imbue(loc);
	out.imbue(loc);
	out.open("output.csv");
	out<<setiosflags(ios::fixed);
	cout<<setiosflags(ios::fixed);
	int i,j=1,ndop=16;
	double h, Y1=1.0, Y2=0.5;
	double *a, *b, *c, *d, *x, *y, *dy, *u, *du, *raz;
	cout<<setw(5)<<"n"<<setw(t)<<"norma1"<<setw(t)<<"norma2"<<setw(t)<<"norma3"<<setw(t)<<"max_norma"<<endl;

	do
	{  	n*=2;
		h=(B-A)/n;
		a=new double[n+1]; b=new double[n+1]; c=new double[n+1]; d=new double[n+1]; x=new double[n+1]; y=new double[n+1]; dy=new double[n+1]; u=new double[n+1]; du=new double[n+1]; raz=new double[n+1];
		
		for(i=0;i<=n;i++)
		{
			x[i]=A+h*i;
			u[i]=U(x[i]);
			du[i]=dU(x[i]);
		}
		a[0]=0;
		b[0]=1.0;
		c[0]=0;
		d[0]=Y1;
		for(i=1;i<n;i++)
		{
			a[i]=1.0/(h*h)-p(x[i])/(2.0*h);
			b[i]=-(2.0/(h*h)+q(x[i]));
			c[i]=1.0/(h*h)+p(x[i])/(2.0*h);
			d[i]=f(x[i]);
		}
		a[n]=0;
		b[n]=1.0;
		c[n]=0;
		d[n]=Y2;
		Progon(a,b,c,d,y,n);
		dY(y,dy,n,h);
		for(i=0;i<=n+1;i++)
			raz[i]=u[i]-y[i];
		cout<<setw(5)<<setprecision(1)<<n<<setw(t)<<setprecision(r)<<norm1(raz,n)<<setw(t)<<setprecision(r)<<norm2(raz,n)<<setw(t)<<setprecision(r)<<norm3(raz,n)<<setw(t)<<setprecision(r)<<max(raz,n)<<endl;
		j++;
	}
	while(max(raz,n)>e);
	cout<<endl;
	cout<<setw(8)<<setprecision(r)<<"x"<<setw(t)<<setprecision(r)<<"u"<<setw(t)<<setprecision(r)<<"y" <<endl;
	
	
	out<<"x[i]"<<";"<<"y[i]"<<";"<<"dy[i]"<<";"<<"u[i]"<<";"<<"du[i]"<<";"<<"fabs(u[i]-y[i])"<<";"<<"n"<<";"<<"norma1"<<";"<<"norma2"<<";"<<"norma3"<<";"<<"max_norma"<<endl;
	
	int shag;
	if(n>ndop)
		shag=n/ndop;
	else
		shag=1;
	for(i=0;i<=n;i+=shag)
	{
		cout<<setw(8)<<setprecision(r)<<x[i]<<setw(t)<<setprecision(r)<<u[i]<<setw(t)<<setprecision(r)<<y[i]<<endl;

	    out<<x[i]<<";"<<y[i]<<";"<<dy[i]<<";"<<u[i]<<";"<<du[i]<<";"<<fabs(u[i]-y[i])<<";"<<n<<";"<<norm1(raz,n)<<";"<<norm2(raz,n)<<";"<<norm3(raz,n)<<";"<<max(raz,n)<<endl;

			}
	//cout<<1/pow(2.0,j-1)<<endl;
	delete [] a; delete [] b; delete [] c; delete [] d; delete [] x; delete [] y; delete [] dy; delete [] u; delete [] du;

	out.close();
	system("PAUSE");
}
Соседние файлы в папке лабы