0 svar
114 visningar
Liann 24
Postad: 21 nov 2023 15:39

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)

Svara
Close