Advertisement
Guest User

Untitled

a guest
May 20th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.85 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <iomanip>
  4. #include <fstream>
  5. using namespace std;
  6.  
  7. class Rownanie{
  8. public:
  9. double bezposrednia_metoda_Eulera(double h, double t);
  10. double posrednia_metoda_Eulera(double h, double t);
  11. double metoda_trapezow(double h, double t);
  12.  
  13. double wzor_analityczny(double t);
  14. };
  15.  
  16. /**
  17. * Wyliczenie wartości w punkcie ze wzoru analitycznego
  18. * @return Wartość dokładna w punkcie "t" wyliczona ze wzoru analitycznego
  19. */
  20. double Rownanie::wzor_analityczny(double t)
  21. {
  22. return (1+t)*exp(-t);
  23. }
  24.  
  25. /**
  26. * Metoda obliczająca przybliżenie równania różniczkowego pierwszego stopnia w punkcie z danym krokiem bezspośrednią metodą Eulera
  27. * @param h Krok do zastosowania w obliczeniach. Im mniejszy tym bardziej dokładne obliczenia
  28. * @param t Punkt, dla którego wyliczamy przybliżenie
  29. * @return Przybliżona wartość równania rózniczkowego w punkcie i z krokiem przekazanym do metody
  30. */
  31. double Rownanie::bezposrednia_metoda_Eulera(double h, double t)
  32. {
  33. double blad = 0.0;
  34. double y = 1.0; //warunek początkowy; y(0) = 1
  35. double wart_dokl = 0.0;
  36.  
  37. for(double i=0; i<t; i+=h)
  38. {
  39. wart_dokl = wzor_analityczny(i);
  40. y = y + h * (-y + exp(-i)); //obliczanie kolejnych przybliżeń ze wzoru: x(h+t) = x(t) + h * x'(t)
  41.  
  42. wart_dokl = fabs(wart_dokl - y);
  43. if(wart_dokl > blad)
  44. blad = wart_dokl;
  45. }
  46. return blad;
  47. }
  48.  
  49. /**
  50. * Metoda obliczająca przybliżenie równania różniczkowego pierwszego stopnia w punkcie z danym krokiem pośrednia metodą Eulera
  51. * @param h Krok do zastosowania w obliczeniach. Im mniejszy tym bardziej dokładne obliczenia
  52. * @param t Punkt, dla którego wyliczamy przybliżenie
  53. * @return Przybliżona wartość równania rózniczkowego w punkcie i z krokiem przekazanym do metody
  54. */
  55. double Rownanie::posrednia_metoda_Eulera(double h, double t)
  56. {
  57. double blad = 0.0;
  58. double y = 1.0; //warunek początkowy; y(0) = 1
  59. double wart_dokl = 0.0;
  60.  
  61. for(double i=0; i<t; i+=h)
  62. {
  63. wart_dokl = wzor_analityczny(i);
  64. y = (y + exp(-i) * h) / (1 + h); //obliczanie kolejnych przybliżeń ze wzoru: x(h+t) = x(t) + h * f(t+1/2h,y(t)+1/2h*y(t, y(t))
  65.  
  66. wart_dokl = fabs(wart_dokl - y);
  67. if(wart_dokl > blad)
  68. blad = wart_dokl;
  69. }
  70.  
  71. return blad;
  72. }
  73.  
  74. /**
  75. * Metoda obliczająca przybliżenie równania różniczkowego pierwszego stopnia w punkcie z danym krokiem metodą Trapezów
  76. * @param h Krok do zastosowania w obliczeniach. Im mniejszy tym bardziej dokładne obliczenia
  77. * @param t Punkt, dla którego wyliczamy przybliżenie
  78. * @return Przybliżona wartość równania rózniczkowego w punkcie i z krokiem przekazanym do metody
  79. */
  80. double Rownanie::metoda_trapezow(double h, double t)
  81. {
  82. double blad = 0.0;
  83. double y = 1.0; //warunek początkowy; y(0) = 1
  84. double wart_dokl = 0.0;
  85.  
  86. for(double i=0; i<t; i+=h)
  87. {
  88. wart_dokl = wzor_analityczny(i);
  89. y = (2.0 * y -((y - exp(-i) - exp(-i + h)) * h)) / (2.0 + h); //obliczanie kolejnych przybliżeń ze wzoru: x(h+t) = x(t) + 1/2 * h * (f(t,y(t))+f(t+h, y(t)+h*f(t,y(t)))
  90.  
  91. wart_dokl = fabs(wart_dokl - y);
  92. if(wart_dokl > blad)
  93. blad = wart_dokl;
  94. }
  95.  
  96. return blad;
  97. }
  98.  
  99. int main()
  100. {
  101. Rownanie rown;
  102. double krok = 0.1; //krok dla metod
  103. const double tmax = 20; //maks. wartość punktu
  104. fstream plik; //plik do zapisania wyników
  105.  
  106. plik.open("wyniki.txt", ios::out);
  107. if( plik.good() != true )
  108. cout << "Nie uzyskano dostepu do pliku!" << endl;
  109.  
  110. plik << "Rozwiazanie dla punktu: t = ;" << tmax << endl << "Wartosc dokladna = ;" << rown.wzor_analityczny(tmax) << endl << "Błędy" << endl;
  111. plik << "krok;bez. Eulera;pos. Eulera;M. trapezow" << endl;
  112.  
  113. for(int i=0; i<20; i++)
  114. {
  115. plik << krok << ";" << rown.bezposrednia_metoda_Eulera(krok, tmax)
  116. << ";" << rown.posrednia_metoda_Eulera(krok, tmax) << ";" << rown.metoda_trapezow(krok, tmax) << endl;
  117. krok/=2;
  118. }
  119.  
  120. plik.close();
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement