newton rhapsons metod ger linjär konvergens?
"infoga programmeringskod fungerar ej men bifogat är MATLAB kod.
newton rhapson metoden ska ge kvadratisk konvergens. Jag har satt in mina e värden för residualen av varje iteration i en vektor konv, och tar sedan kvoten av de olika elementen i konv för att jämföra. problemet är att konv(end)/ konv(end-1) & konv(end-1)/ konv(end-2) alltid är mycket närmare varandra än konv(end)/ konv(end-1)^2 & konv(end-1)/ konv(end-2)^2 är. De är något nära 1 medans de andra är något i stil med 10^7.
Borde inte detta tyda på linjär konvergens istället för kvadratisk? Det borde inte gå att få linjär konvergens med newton rhapson metoden, så har jag gjort något fel i koden eller har jag misstolkat något? Supertacksam för svar.
kod följer:
-----
%implementerar newton rhapson metoden för beräknad formel i uppgift 1.
%samt given startgissning för d och tolerans
%startgissning för d
d=0.007;
%givna specifikationer och parametervärden
dI=1.219;
Rfi=1.76*(10^(-4));
Rf0=Rfi;
hs=356;
ht=hs;
kw=60;
dTm=29.6;
Q=801368;
Aex=64.15;
%formulering av funktion och derivata som jag kom fram till innan
%uppdelad i variabler för att minimera risk för skrivfel
a=((1/ht)+Rfi)/dI;
b=log(d/dI)/(2*kw);
c=d*(a+b)+Rf0+(1/hs);
f=c*(Q/dTm)-Aex;
A=((1/ht)+Rfi)/dI;
B=(log(d/dI)+1)/(2*kw);
df=(Q/dTm)*(A+B);
%definiera d0 = di
%samt d1 = di+1 (själva startvärdet på d1 har ingen påverkan
%sålänge som toleransen inte är uppnådd så att while loopen kan starta)
d0=d;
d1=10;
konv=[abs(d1-d0)];
%om e=(di+1-di) är större än tolerans upprepas newton rhapson metoden
%en till iteration, tills toleranskravet uppnås
while abs(d1-d0)>10^(-8);
%räkna ut f(d) och f'(d)
a=((1/ht)+Rfi)/dI;
b=log(d/dI)/(2*kw);
c=d*(a+b)+Rf0+(1/hs);
f=c*(Q/dTm)-Aex;
A=((1/ht)+Rfi)/dI;
B=(log(d/dI)+1)/2*kw;
df=(Q/dTm)*(A+B);
%ser till att nuvarande di+1 blir d nästa iteration
d0=d;
%di+1=di-f(di)/f'(di)
d1=d-f/df;
%ser till att nuvarande di+1 blir di nästa iteration
d=d1;
konv=[konv, abs(d1-d0)];
end
%om e är mindre än 10^-8 är den mindre än 5*10^-8= 10^-7 * 0,5 ,
%så 7 decimaler är korrekta med metoden
%visar d med 7 korrekta decimaler
num2str(d,6)
konv(end)/ konv(end-1)^2
konv(end-1)/ konv(end-2)^2
konv(end)/ konv(end-1)
konv(end-1)/ konv(end-2)