Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:KM2016 / Hyperbolic / test_hyperb
.cpp//demonstration of function hyperb
//#include<process.h>
//#include <conio.h>
//#include <alloc.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "hyperb.cpp"
///////////////////////////////////////////////////////////////
//Функции задаются пользователем для тестирования
double U(double x,double t)
{return x*x*x*t*t*t+x*t;}
///////////////////////////////////////////////////////////
double derUonT(double x,double t)
{return 3*t*t*x*x*x+x;}
double derUonT2(double x,double t)
{return 6*t*x*x*x;}
double derUonX(double x,double t)
{return 3*x*x*t*t*t+t;}
double derUonX2(double x,double t)
{return 6*x*t*t*t;}
double T0;
double U0(double x,double t)
{return U(x,t);}
double U1(double x,double t)
{return derUonT(x,t);}
double funk(double x,double t)
{return t*t+x*x;}
double funa(double x,double t)
{return t*t*x*x;}
double derfunaonX(double x,double t)
{return t*t*2*x;}
double funb(double x,double t)
{return 2*x*t*(t+1);}
double fung(double x,double t)
{return x*t*t+x*x;}
/////////////////////////////////////
double funf(double x,double t)
{return -derfunaonX(x,t)*derUonX(x,t)-funa(x,t)*derUonX2(x,t)-
funb(x,t)*derUonX(x,t)+fung(x,t)*U(x,t)+funk(x,t)*derUonT(x,t)
+derUonT2(x,t);
}
double func(int nbound,double t)
{return 1;}
double fund(int nbound,double t)
{return 1;}
double A,B;
double fune(int nbound,double t)
{if(nbound==0)
return func(nbound,t)*U(A,t)-fund(nbound,t)*derUonX(A,t);
else
return func(nbound,t)*U(B,t)+fund(nbound,t)*derUonX(B,t);
}
double error(double xtochn,double x)
{if(xtochn==0.)return 0;double res=100*fabs((xtochn-x)/xtochn);
if(res<1.e-5)return 0;else return res;
}
////////////////////////////////////////////////////
int main(void) {// test of fem5.cpp
int ind=0,// параметр, характеризующий гладкость начальных данных
N=11,Nt=4,porjadok=4,i,j;
double Xi[11]={1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0};
double MNOG=2,ADD=-0.5;
for(i=0;i<N;i++) Xi[i]+=ADD;
for(i=0;i<N;i++) Xi[i]*=MNOG;
double Tj[4]={0.,0.2,0.3,0.4};
A=Xi[0];
B=Xi[N-1];
T0=Tj[0];
float **Uij=new float *[N],**derUij=new float *[N], **der2Uij=new float *[N];
for(i=0;i<N;i++) {
Uij[i]=new float[Nt];
derUij[i]=new float[Nt];
der2Uij[i]=new float[Nt];
}
hyperbol(funk,funa,funb,fung,funf,
U0,//Начальные значения решения
U1,//Начальные значения решения производной по времени
ind,// параметр, характеризующий гладкость начальных данных по
// пространственным переменным; ind=0-данные непрерывны;
// ind=1-данные кусочно непрерывны;
func,//Граничные условия
fund,//Граничные условия
fune,//Граничные условия
N,//Число узлов по пространственной переменной
Xi,//Узлы по пространственной переменной
porjadok,//порядок квадратурной формулы Гаусса при интегрировании по
//пространственной переменной, a_porjadok<=4
Nt,//Число узлов по времени
Tj,//Узлы по времени
// ВЫХОДНЫЕ ПАРАМЕТРЫ
Uij,//Решение в узловых точках по пространству и времени,
//Uij[i][j]=u(x_i,t_j)
derUij,der2Uij
);
//Запись результатов
FILE *prtex=fopen("testhyp.tex","w");
fprintf(prtex,"\\documentclass[a4paper,14pt]{disser}\n");
fprintf(prtex,"\\usepackage[a4paper, mag=1000, includefoot,left=2.2cm, right=2.2cm,\n");
fprintf(prtex,"top=2cm, bottom=2.5cm,headsep=1cm, footskip=1cm]{geometry}\n");
fprintf(prtex,"\\usepackage[T2A]{fontenc}\n");
fprintf(prtex,"\\usepackage[utf8x]{inputenc}\n");
fprintf(prtex,"\\usepackage[english,russian]{babel}\n");
fprintf(prtex,"\\usepackage{amssymb,amsfonts,amsmath,mathtext,enumerate,float} \n");
fprintf(prtex,"\\begin{document}\n");
fprintf(prtex,"\\normalsize\n");
fprintf(prtex,"\\section*{Тестирование программы hyperbol}\n");
fprintf(prtex,"При решении начальной задачи методом Рунге-Кутта число\n");
fprintf(prtex,"обращений к функции для вычисления правой части равно ");
fprintf(prtex,"%d.\n\n",COUNT);
fprintf(prtex,"Поточечные оценки точности аппроксимации\n");
fprintf(prtex,"в узловых точках по пространству дается выражениями\n");
fprintf(prtex,"\\[\\delta_i=\\left|1-\\frac{\\tilde u_i}{u_i}\\right|,\\quad\n");
fprintf(prtex,"\\delta_i'=\\left|1-\\frac{\\partial \\tilde u_i/\\partial t}\n");
fprintf(prtex,"{\\partial u_i/\\partial t}\\right|,\\quad\n");
fprintf(prtex,"\\delta_i''=\\left|1-\\frac{\\partial^2 \\tilde u_i/\\partial t^2}\n");
fprintf(prtex,"{\\partial^2 u_i/\\partial t^2}\\right|,\\]\n");
fprintf(prtex,"где $u_{i}=u(x_i,t)$, $\\tilde u_{i}$ --\n");
fprintf(prtex,"результаты численной аппроксимации решения исходной задачи в точке $(x_i,t)$.\n");
fprintf(prtex,"\n");
fprintf(prtex,"\nРезультаты представлены в таблице.\n");
fprintf(prtex,"\\begin{center}\n");
fprintf(prtex,"\\scriptsize\n");
fprintf(prtex,"\\begin{tabular}{|");
for(i=0;i<=N;i++) fprintf(prtex,"l|"); fprintf(prtex,"}");
fprintf(prtex,"\\hline\n");
for(j=0;j<Nt;j++){
fprintf(prtex,"\\multicolumn{%d}{|c|}{Момент времени $t_{%d}=%g$}\\\\\n",
N+1,j,Tj[j]);
fprintf(prtex,"\\hline\n");
fprintf(prtex,"$x_i$");
for(i=0;i<N;i++) fprintf(prtex,"&%.4g",Xi[i]);
fprintf(prtex,"\\\\\n\\hline\n");
fprintf(prtex,"$u_i$");
for(i=0;i<N;i++)fprintf(prtex,"&%.4g",U(Xi[i],Tj[j]));
fprintf(prtex,"\\\\\n\\hline\n");
fprintf(prtex,"$\\tilde u_i$");
for(i=0;i<N;i++)fprintf(prtex,"&%.4g",Uij[i][j]);
fprintf(prtex,"\\\\\n\\hline\n");
// double err;
fprintf(prtex,"$\\delta_i(\\% )$");
for(i=0;i<N;i++) fprintf(prtex,"&%.3g",error(U(Xi[i],Tj[j]),Uij[i][j]));
fprintf(prtex,"\\\\\n\\hline\n");
fprintf(prtex,"$\\partial u_i/\\partial t$");
for(i=0;i<N;i++) fprintf(prtex,"&%.4g",derUonT(Xi[i],Tj[j]));
fprintf(prtex,"\\\\\n\\hline\n");
fprintf(prtex,"$\\partial \\tilde u_i/\\partial t$");
for(i=0;i<N;i++)fprintf(prtex,"&%.4g",derUij[i][j]);
fprintf(prtex,"\\\\\n\\hline\n");
fprintf(prtex,"$\\delta_i'(\\%)$");
for(i=0;i<N;i++) fprintf(prtex,"&%.3g",error(derUonT(Xi[i],Tj[j]),derUij[i][j]));
fprintf(prtex,"\\\\\n\\hline\n");
if(j>0) {
fprintf(prtex,"$\\partial^2 u_i/\\partial t^2$");
for(i=0;i<N;i++) fprintf(prtex,"&%.4g",derUonT2(Xi[i],Tj[j]));
//for(i=0;i<N;i++)fprintf(prtex,"&%.4g",derUonT(Xi[i],Tj[j]));
fprintf(prtex,"\\\\\n\\hline\n");
fprintf(prtex,"$\\partial^2 \\tilde u_i/\\partial t^2$");
for(i=0;i<N;i++)fprintf(prtex,"&%.4g",der2Uij[i][j]);
fprintf(prtex,"\\\\\n\\hline\n");
fprintf(prtex,"$\\delta_i''(\\%)$");
for(i=0;i<N;i++) fprintf(prtex,"&%.3g",error(derUonT2(Xi[i],Tj[j]),der2Uij[i][j]));
//fprintf(prtex,"&%.3g",error(derUonT(Xi[i],Tj[j]),der2Uij[i][j]));
fprintf(prtex,"\\\\\n\\hline\n");
}
}//j
fprintf(prtex,"\\end{tabular}\n");
fprintf(prtex,"\\end{center}\n");
fprintf(prtex,"\\end{document}\n");
fclose(prtex);
for(i=0;i<N;i++) {
delete Uij[i];delete derUij[i];
delete der2Uij[i];}delete Uij;delete derUij;delete der2Uij;
return 1;
}
Соседние файлы в папке Hyperbolic