
Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабы / 3
.cpp#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");
}