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

лабы / 5

.cpp
Скачиваний:
13
Добавлен:
11.06.2015
Размер:
4.49 Кб
Скачать



#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;
}
Соседние файлы в папке лабы