Advertisement
SonicDesu

Euler RR

Jan 13th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 1.22 KB | None | 0 0
  1. clear; clc; close all;
  2. %W zależności od posiadanego równania funkcja sprawdzająca dokładność
  3. %naszych obliczeń  będzie inna, w tym kodzie użyję przykładu dla
  4. %y'=-2y+cosx  -> y = 0.2*exp(sin(x)+2*cos(x))/exp(x*x)
  5. %Rozwiazanie jest analityczne, najlepiej wrzucić równanie do Wolframa
  6.  
  7. h = 0.1; %krok początkoy
  8. eps = 0.01; %wymagana dokładność
  9. precision = @(x) 0.2*exp(sin(x)+2*cos(x))/exp(x*x);
  10. f = @(x,y) -2*y+cos(x);
  11. x=0; %warunek początkowy
  12. y=1; %warunek początkowy
  13.  
  14. disp(['y(' num2str(x) ') = ' num2str(y) ' dokladna: ' num2str(precision(x))  ' blad: '  num2str(abs(y-precision(x)))  ' h = '  num2str(h)]);
  15.  
  16.  
  17. %W matlabie nie istnieje pętla do while, dlatego stosujemy pętlę
  18. %niskończoną while z breakiem, wychodzi na to samo.
  19. while 1
  20.    h=h*2;
  21.    while 1
  22.        h=h/2;
  23.        y1=y+h*f(x,y); %wartość przybliżona wyznaczona z krokiem h
  24.        y2=y+2*h*f(x,y); %wartość przybliżona wyznaczona z krokiem 2h
  25.        if(abs(y1-y2)<eps)
  26.            break;
  27.        end
  28.    end
  29.     y = y1;
  30.     x=x+h;
  31.     disp(['y(' num2str(x) ') = ' num2str(y) ' dokladna: ' num2str(precision(x))  ' blad: '  num2str(abs(y-precision(x)))  ' h = '  num2str(h)]);
  32.     if (x>=1)
  33.         break;
  34.     end
  35. end
  36.  
  37. % by MJ
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement