Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабы / 5
.cpp
#include <fstream>
#include <iomanip>
#include <cmath>
#include <conio.h>
#include <iostream>
#include <string.h>
using namespace std;
ofstream out;
const double a1=2.0/3.0, u0=1.0, bet1=-2.0, v1=0.0;
const double p1=4.0, p2=1.0, q1=1.0, q2=1.0;
//Вспомогательные коэффициенты при решении системы уравнений
double alpha = 2*exp(-1.0/3.0)+2*exp(1.0/3.0)*(bet1+2)/(bet1-2);
double beta = 2*bet1*u0/(bet1-2)*exp(1.0/3.0);
double ksi = exp(4.0/3.0) + exp(2.0/3.0);
double gamma = v1*exp(1.0/3.0);
//
double c3 = (4/alpha*(beta+gamma)*exp(-1.0/3.0)-3*v1*exp(1.0/3.0)) / (exp(2.0/3.0)-3*exp(4.0/3.0)+4*ksi/alpha*exp(-1.0/3.0));
double c4 = v1*exp(1.0)-c3*exp(2.0);
double c2 = (beta+gamma-ksi*c3)/alpha;
double c1 = bet1*u0/(bet1-2)-(bet1+2)/(bet1-2)*c2;
double p (double x)
{
if (x < a1)
return p1;
else
return p2;
}
double q (double x)
{
if (x < a1)
return q1;
else
return q2;
}
double U(double x)
{
if (x < a1)
return (c1*exp(0.5*x)+c2*exp(-0.5*x));
else
return (c3*exp(x)+c4*exp(-x));
}
double w1=(-bet1*(v1-U(1)));
double dU(double x)
{
if (x < a1)
return (0.5*c1*exp(0.5*x)-0.5*c2*exp(-0.5*x));
else
return (c3*exp(x)-c4*exp(-x));
}
double W (double x)
{
return - p(x) * dU(x);
}
double *init (int n)
{
double *A = new double [n];
for (int i=0; i<n; i++)
{
A[i] = 0;
}
return A;
}
double s (double x, double h)
{
if(x<a1)
return p1;
else if(x-h>=a1)
return p2;
else
return h/((a1-x+h)/p1 + (x-a1)/p2);
}
double * progonka (int n)
{
int N = n+1, i;
double *y = init(N), *K = init(N), *L = init(N),*x = init(N);
double h = 1.0/n;
for (i=0; i<=n; i++)
x[i]=i*h;
K[1] = bet1 * u0 * h / (p1 + 0.5*h * h * q1+bet1*h);
L[1] = p1 / (p1 + 0.5 * h * h * q1 + bet1 * h);
double a,b,c, d = 1;
for (i=1; i<n; i++)
{
a = s(x[i],h) / (h*h);
b = -((s(x[i],h) + s(x[i+1],h)) / h + h * d)/h;
c = s(x[i+1],h) / (h*h);
L[i + 1] = -c / (b + a * L[i]);
K[i + 1] = (-a * K[i] + 0.0) / (b + a * L[i]);
}
y[n] = v1;
for (int i = n - 1; i >= 0; --i)
y[i] = L[i + 1] * y[i + 1] + K[i + 1];
return y;
}
int main ()
{
int n = 20, i;
double *y = progonka(n);
double *y2 = progonka(n/2);
double *u = init(n+1), *w = init (n), *x = init(n+1), *z = init(n);
double h = 1.0/n;
locale loc("rus_rus.866"); wcout.imbue(loc);
out.imbue(loc);
out.open("output.csv");
out<<setiosflags(ios::fixed);
cout<<setiosflags(ios::fixed);
for (i=0; i<=n; i++)
x[i]=i*h;
for (i=0; i<n; i++)
{
z[i] = -(y[i+1] - y[i])/h * s(x[i+1], h);
}
for (i=0; i<n; i++)
{
x[i] = i*h;
u[i] = U(x[i]);
w[i] = W(x[i] + 0.5*h);
}
x[i] = i*h;
u[i] = U(x[i]);
int p=10, r = 4;
cout << setw(p) << "x" << setw(p) << "u" << setw(p) << "y" << setw(p) << "w" << setw(p) << "z" << setw(p) << "u-y" << setw(p) << "w-z" << setw(p) << "R\n";
out << "x" << ";" << "u" <<";" << "y" << ";" << "w" << ";" << "z" <<";" << "u-y" <<";"<< "w-z" <<";" << "R\n";
for (i=0; i<n; i++)
{
out << x[i] << ";" << u[i]<< ";" << y[i]<< ";" << w[i]<< ";" << z[i]<< ";" << u[i] - y[i]<< ";" << w[i] - z[i]<< ";" ;
cout << setw(p) << fixed << setprecision(r) << x[i];
cout << setw(p) << fixed << setprecision(r) << u[i];
cout << setw(p) << fixed << setprecision(r) << y[i];
cout << setw(p) << fixed << setprecision(r) << w[i];
cout << setw(p) << fixed << setprecision(r) << z[i];
cout << setw(p) << fixed << setprecision(r) << u[i] - y[i];
cout << setw(p) << fixed << setprecision(r) << w[i] - z[i];
if ((i%2) == 0)
out<< ";" << (y[i]- y2[i/2])/3;
out << endl;
cout << setw(p) << fixed << setprecision(r) << (y[i]- y2[i/2])/3;
cout << endl;
}
out<<endl;
out << ";" << x[i]<< ";" << u[i]<< ";" << y[i]<< ";" << " "<< ";" << " "<< ";" << u[i] - y[i]<< ";" << " "<< ";" << (y[i]- y2[i/2])/3;
cout << setw(p) << fixed << setprecision(r) << x[i];
cout << setw(p) << fixed << setprecision(r) << u[i];
cout << setw(p) << fixed << setprecision(r) << y[i];
cout << setw(p) << fixed << setprecision(r) << " ";
cout << setw(p) << fixed << setprecision(r) << " ";
cout << setw(p) << fixed << setprecision(r) << u[i] - y[i];
cout << setw(p) << fixed << setprecision(r) << " ";
cout << setw(p) << fixed << setprecision(r) << (y[i]- y2[i/2])/3;
_getch();
return 0;
}