Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- clear; clc; close all;
- %W zależności od posiadanego równania funkcja sprawdzająca dokładność
- %naszych obliczeń będzie inna, w tym kodzie użyję przykładu dla
- %y'=-2y+cosx -> y = 0.2*exp(sin(x)+2*cos(x))/exp(x*x)
- %Rozwiazanie jest analityczne, najlepiej wrzucić równanie do Wolframa
- h = 0.1; %krok początkoy
- eps = 0.01; %wymagana dokładność
- precision = @(x) 0.2*exp(sin(x)+2*cos(x))/exp(x*x);
- f = @(x,y) -2*y+cos(x);
- x=0; %warunek początkowy
- y=1; %warunek początkowy
- disp(['y(' num2str(x) ') = ' num2str(y) ' dokladna: ' num2str(precision(x)) ' blad: ' num2str(abs(y-precision(x))) ' h = ' num2str(h)]);
- %W matlabie nie istnieje pętla do while, dlatego stosujemy pętlę
- %niskończoną while z breakiem, wychodzi na to samo.
- while 1
- h=h*2;
- while 1
- h=h/2;
- y1=y+h*f(x,y); %wartość przybliżona wyznaczona z krokiem h
- y2=y+2*h*f(x,y); %wartość przybliżona wyznaczona z krokiem 2h
- if(abs(y1-y2)<eps)
- break;
- end
- end
- y = y1;
- x=x+h;
- disp(['y(' num2str(x) ') = ' num2str(y) ' dokladna: ' num2str(precision(x)) ' blad: ' num2str(abs(y-precision(x))) ' h = ' num2str(h)]);
- if (x>=1)
- break;
- end
- end
- % by MJ
Advertisement
Add Comment
Please, Sign In to add comment