[Matlab] Błąd w obliczeniach numerycznych

ostrowwlkp
Użytkownik
Użytkownik
Posty: 22
Rejestracja: 10 sty 2011, o 20:12
Płeć: Mężczyzna
Lokalizacja: Ostrów Wlkp

[Matlab] Błąd w obliczeniach numerycznych

Post autor: ostrowwlkp »

Witam ma problem z wykresem nie wykreśla błędu względnego odcięcia różnicy centralnej oraz błędu względnego odcięcia różnicy progresywnej (po zmianie x na 3 oraz h na 4 wykres jest prawidłowy)

\(\displaystyle{ f(x)=xcos(x)}\)
\(\displaystyle{ x _{0} = \frac{ \pi }{4}}\)

\(\displaystyle{ h _{0} = \frac{ \pi }{6}}\)
-funkcja

Kod: Zaznacz cały

function[y]=funkcja(x)
y=x.*cos(x);
-pochodna 1

Kod: Zaznacz cały

function[y]=poch1(x)
y=cos(x)-x*sin(x);
-pochodna 2

Kod: Zaznacz cały

function[y]=poch2(x)
y=-2.*sin(x)-x.*cos(x);
-pochodna 3

Kod: Zaznacz cały

function[y]=poch3(x)
y=-3.*cos(x))+x.*sin(x);
-program

Kod: Zaznacz cały

x0=pi/4; 
h0=pi/6; 
d0=feval('funkcja',x0);
d1=feval('poch1', x0); 
d2=feval('poch2', x0); 
d3=feval('poch3', x0); 
i=1:40;    
h1=h0*2.^(1-i); 
fx0h1p=feval('funkcja',x0+h1);
Dp=(fx0h1p-d0)./h1;
bb1=abs(Dp-d1);
bw1=abs(bb1/d1);  
bgp=(h1/2*d2)/d1; 
i=1:40;     
h2=h0*2.^(1-i); 
fx0h1c=feval('funkcja',x0+h2); 
fx0h2c=feval('funkcja',x0-h2);
Dc=(fx0h1c-fx0h2c)./(2*h2); 
bb2=abs(Dc-d1);
bw2=abs(bb2/d1);  
bgc=((h2.^2/6)*d3)/d1;  
loglog(h1,bw1,'k*',h2,bw2,'r+',h1,bgp,'c.',h2,bgc,'y.')
legend('r. progresywna', 'r. centralna', 'blad wzgledny odciecia r. progr.', 'blad wzgledny odciecia r.centr.',4)
xlabel('log(h)');
ylabel('log(blad wzgledny)');
legend('roznica progresywna', 'roznica centralna', 'blad wzgledny odciecia r. progr.', 'blad wzgledny odciecia r.centr.',4);
Ostatnio zmieniony 5 lip 2013, o 19:05 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
mdd
Użytkownik
Użytkownik
Posty: 1897
Rejestracja: 14 kwie 2013, o 10:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 2 razy
Pomógł: 512 razy

[Matlab] Błąd w obliczeniach numerycznych

Post autor: mdd »

ostrowwlkp pisze: -pochodna 1

Kod: Zaznacz cały

function[y]=poch1(x)
y=cos(x)-x*sin(x);
Może zamień na:

Kod: Zaznacz cały

function[y]=poch1(x)
y=cos(x)-x.*sin(x);
ostrowwlkp pisze: -pochodna 3

Kod: Zaznacz cały

function[y]=poch3(x)
y=-3.*cos(x))+x.*sin(x);
Lepiej będzie tak:

Kod: Zaznacz cały

function[y]=poch3(x)
y=-3.*cos(x)+x.*sin(x);
W pliku głównym wszystko jest OK. U mnie działa (przynajmniej w Octave).
W trakcie wykonywania instrukcji loglog() występuje ostrzeżenie:
warning: axis: omitting non-positive data in log plot
i tyle.
Może wykorzystaj skalę liniową plot() na początek.
ODPOWIEDZ