Advertisement
Guest User

Untitled

a guest
May 24th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.65 KB | None | 0 0
  1. /////plik z klasą równania
  2.  
  3. #include "SecOrderNumDiffEq.h"
  4.  
  5. SecOrderNumDiffEq::SecOrderNumDiffEq(double (*p)(double), double (*r)(double), double (*s)(double),
  6. double a, double b,double h) : p(p), r(r), s(s), h(h), a(a), b(b) {
  7. n=(b-a)/h + 1;
  8. }
  9.  
  10. void SecOrderNumDiffEq::setupConditions(double alpha, double beta, double gamma, double phi, double psi, double theta) {
  11. this->alpha = alpha;
  12. this->beta = beta;
  13. this->gamma = gamma;
  14. this->phi = phi;
  15. this->psi = psi;
  16. this->theta = theta;
  17. }
  18.  
  19. void SecOrderNumDiffEq::prepareData() {
  20. vector<double> u = vector<double>(n-1);
  21. vector<double> d = vector<double>(n);
  22. vector<double> l = vector<double>(n);
  23. right = vector<double>(n);
  24.  
  25. u[0] = alpha/h;
  26. d[0] = beta - alpha/h;
  27. d[n-1] = phi/h + psi;
  28. l[n-1] = -phi/h;
  29. right[0] = -gamma;
  30. right[n-1] = -theta;
  31. double xi = a+h;
  32. for(int i=1; i<n-1; i++)
  33. {
  34. l[i] = 1/h/h + r(xi-h)/12;
  35. u[i] = 1/h/h + r(xi+h)/12;
  36. d[i] = 10*r(xi)/12 - 2/h/h;
  37. right[i] = -(s(xi-h) + 10*s(xi) + s(xi+h))/12;
  38. xi+=h;
  39. }
  40. l.erase(l.begin());
  41. T = ThomasMatrix(u,d,l);
  42. }
  43.  
  44. vector<double> SecOrderNumDiffEq::solve() {
  45. prepareData();
  46. ThomasEquation eq = ThomasEquation(T);
  47. vector<double> y = eq.solveXfor(right);
  48.  
  49. return y;
  50. }
  51.  
  52. unsigned long SecOrderNumDiffEq::getN() const {
  53. return n;
  54. }
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61. //plik main
  62. #include <iostream>
  63. #include <cmath>
  64. #include <fstream>
  65. #include "ThomasEquation.h"
  66. #include "SecOrderDiffEq.h"
  67. #include "SecOrderNumDiffEq.h"
  68.  
  69. using namespace std;
  70. void display(vector<double> x);
  71. double u(double x)
  72. {
  73. return (2*x*cos(2*x)+2*sin(2*x)-log(2)*sin(2*x)-2*log(cos(x))*sin(2*x))/4;
  74. }
  75.  
  76. void command(FILE *pipe,string cmd)
  77. {
  78. cmd+="\n";
  79. fprintf(pipe,cmd.c_str());
  80. fflush(pipe);
  81. }
  82.  
  83. int main() {
  84. double h=1e-7,a=0, b=M_PI_4;
  85.  
  86. ofstream bledy;
  87. bledy.open("bledy.csv");
  88. vector<vector<double>> rozwClassic = vector<vector<double>>(14,vector<double>(100,0));//wektor na rozwiązania numeryczne metodą klasyczną
  89. vector<vector<double>> rozwNumerow = vector<vector<double>>(14,vector<double>(100,0));//wektor na rozwiązania numeryczne metodą numerowa
  90.  
  91. for(int j=0; j<14; j+=2) {
  92. //rozwiązanie schematem klasycznym
  93. /*SecOrderDiffEq classicEQ([](double x) -> double { return 1.0; }, [](double x) -> double { return 0.0; },
  94. [](double x) -> double { return 4.0; }, [](double x) -> double { return tan(x); }, a, b, h);
  95. classicEQ.setupConditions(0.0, 1.0, 0.0, 0.0, 1.0, -1.0 / 2.0);
  96. vector<double> yClassic = classicEQ.solve();
  97. */
  98. //rozwiązanie schematem numerowa
  99. SecOrderNumDiffEq numerowEQ([](double x) -> double { return 1.0; }, [](double x) -> double { return 4.0; },
  100. [](double x) -> double { return tan(x); }, a, b, h);
  101. numerowEQ.setupConditions(0.0, 1.0, 0.0, 0.0, 1.0, -1.0 / 2.0);
  102. vector<double> yNumerow = numerowEQ.solve();
  103.  
  104. int n = numerowEQ.getN(),k=0,step;
  105. if(n > 100)
  106. step=n/100+1;
  107. else
  108. step=1;
  109. double xi = a;
  110. //double maxC = fabs(u(xi) - yClassic[0]);
  111. double maxN = fabs(u(xi) - yNumerow[0]);
  112. for (int i = 1; i < n; i++) {
  113. xi += h;
  114. //maxC = (maxC > (fabs(u(xi) - yClassic[i]))) ? maxC : fabs(u(xi) - yClassic[i]);
  115. maxN = (maxN > (fabs(u(xi) - yNumerow[i]))) ? maxN : fabs(u(xi) - yNumerow[i]);
  116. if(i%step == 0){
  117. //rozwClassic[j][k]=xi;
  118. //rozwClassic[j+1][k]=yClassic[i];
  119. rozwNumerow[j][k]=xi;
  120. rozwNumerow[j+1][k]=yNumerow[i];
  121. k++;
  122. }
  123. }
  124. bledy<<log10(h)<<" "/*<<log10(maxC)<<" "*/<<log10(maxN)<<endl;
  125. h*=10;
  126. }
  127. bledy.close();
  128.  
  129. //wpisanie tablicy z rozwiązaniami numerycznymi do pliku
  130. //classic
  131. /*ofstream rozwC;
  132. rozwC.open("rozw.csv");
  133. for(int i=0; i<100; i++)
  134. rozwC<<rozwClassic[0][i]<<" "<<rozwClassic[1][i]<<" "<<rozwClassic[2][i]<<" "<<rozwClassic[3][i]<<" "<<rozwClassic[4][i]<<" "
  135. <<rozwClassic[5][i]<<" "<<rozwClassic[6][i]<<" "<<rozwClassic[7][i]<<" "<<rozwClassic[8][i]<<" "<<rozwClassic[9][i]<<" "
  136. <<rozwClassic[10][i]<<" "<<rozwClassic[11][i]<<" "<<rozwClassic[12][i]<<" "<<rozwClassic[13][i]<<endl;
  137. rozwC.close();*/
  138. //numerow
  139. ofstream rozwN;
  140. rozwN.open("rozw2.csv");
  141. for(int i=0; i<100; i++)
  142. rozwN<<rozwNumerow[0][i]<<" "<<rozwNumerow[1][i]<<" "<<rozwNumerow[2][i]<<" "<<rozwNumerow[3][i]<<" "<<rozwNumerow[4][i]<<" "
  143. <<rozwNumerow[5][i]<<" "<<rozwNumerow[6][i]<<" "<<rozwNumerow[7][i]<<" "<<rozwNumerow[8][i]<<" "<<rozwNumerow[9][i]<<" "
  144. <<rozwNumerow[10][i]<<" "<<rozwNumerow[11][i]<<" "<<rozwNumerow[12][i]<<" "<<rozwNumerow[13][i]<<endl;
  145. rozwN.close();
  146.  
  147.  
  148. //rysowanie wykresu rozwiązania
  149. //classic
  150. FILE *plot_wykres = popen("gnuplot 2>/dev/null","w");
  151. command(plot_wykres,"set yrange [0:pi/4]");
  152. command(plot_wykres,"plot (2*x*cos(2*x)+2*sin(2*x)-log(2)*sin(2*x)-2*log(cos(x))*sin(2*x))/4 t 'analityczne',\
  153. 'rozw.csv' u 1:2 t '10^-7',\
  154. 'rozw.csv' u 3:4 t '10^-6',\
  155. 'rozw.csv' u 5:6 t '10^-5',\
  156. 'rozw.csv' u 7:8 t '10^-4',\
  157. 'rozw.csv' u 9:10 t '10^-3',\
  158. 'rozw.csv' u 11:12 t '10^-2',\
  159. 'rozw.csv' u 13:14 t '10^-1'");
  160. //numerow
  161. FILE *plot_wykres2 = popen("gnuplot 2>/dev/null","w");
  162. command(plot_wykres2,"set yrange [0:pi/4]");
  163. command(plot_wykres2,"plot (2*x*cos(2*x)+2*sin(2*x)-log(2)*sin(2*x)-2*log(cos(x))*sin(2*x))/4 t 'analityczne',\
  164. 'rozw2.csv' u 1:2 t '10^-7',\
  165. 'rozw2.csv' u 3:4 t '10^-6',\
  166. 'rozw2.csv' u 5:6 t '10^-5',\
  167. 'rozw2.csv' u 7:8 t '10^-4',\
  168. 'rozw2.csv' u 9:10 t '10^-3',\
  169. 'rozw2.csv' u 11:12 t '10^-2',\
  170. 'rozw2.csv' u 13:14 t '10^-1'");
  171.  
  172.  
  173. //rysowanie wykresu błędu
  174. FILE *plot_bledy = popen("gnuplot 2>/dev/null", "w");
  175. command(plot_bledy,"plot 'bledy.csv' u 1:2 w lp t 'klasyczny','bledy.csv' u 1:3 w lp t 'numerowa'");
  176.  
  177.  
  178. //zablokowanie terminala żeby zobaczyć wykres
  179. cout<<"nacisnij enter"<<endl;
  180. cin.get();
  181. pclose(plot_wykres);
  182. pclose(plot_wykres2);
  183. pclose(plot_bledy);
  184. return 0;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement