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

KM2016 / Hyperbolic / test_hyperb

.cpp
Скачиваний:
7
Добавлен:
14.03.2016
Размер:
7.9 Кб
Скачать
//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