Side 1 av 1

Finne alle svar på en likning i matlab

Lagt inn: 17/03-2017 23:07
av Stniop
Hei,
Ved å bruke Matlab skal jeg finne alle løsningene til denne likningen, med en feil på mindre enn [tex]10^{-5}[/tex]:
[tex]sin(x)=0.5\sqrt(x)-2x^2+3x^3[/tex]

Jeg har sett på grafen til likningen at løsningene skal ligge mellom 0 og 1, men jeg klarer ikke å finne ut av hvordan koden til programmet skal bli. Oppgaven er en deloppgave der de andre oppgavene handler om nullpunkt og midtpunktsmetoden, så jeg har prøvd meg frem med forskjellige koder som bruker midtpunktsmetoden.

Er det noen her inne som kan hjelpe meg?

Legger inn en av kodene jeg har prøvd, men som ikke fungerer. Når jeg kjører den gir den meg bare veriden som jeg gir b i andre linje.

Kode: Velg alt

a=0;
b=1;

Funk=@(x) 1/2*sqrt(x)-2*x.^2+3*x.^3-(sin(x));

Pres=1e-5;

Fa=Funk(a);
Fb=Funk(b);

while abs(b-a)>2*Pres
  c=(a+b)/2;        
  Fc=Funk(c);     
  if Fa*Fc<0    
    b=c;              
  else
    a=c;              
  end
end

x=(a+b)/2

Re: Finne alle svar på en likning i matlab

Lagt inn: 18/03-2017 01:11
av Skogmus
Metoden du velger å bruke vil bare kunne tilnærme seg 1 rot for det intervallet du gir inn, til tross for at det finnes 3 røtter av likningen totalt. Vil anbefale å ta i bruk en annen metode (Newton's eller sekantmetode?) for å finne flere.

Selve metoden din starter i nullpunktet a (sin(0) = 0), så mulig du bør se på et annet intervall i steden? [-1,1] f.eks. Da er du hvertfall sikret et odde antall nullpunkt i intervallet ettersom [tex]f(-1)*f(1)<0[/tex] og kan finne ett nullpunkt vha biseksjonsmetoden. Ellers bør du sjekke om [tex]f(c)=0[/tex] for alle c du finner, da dette vil være et nullpunkt og du kan stoppe her. I tillegg bruker du den samme Fa som du starter i for hver gjennomgang av whileløkken, selv om a kan flytte på seg. Når f(a) = 0 for hver loop av while, vil jo aldri f(a)*f(c)<0 og du setter a=c hver gang slik at c -> b når man gjør mange nok iterasjoner.

Kan legge ved en eksempelkode på whileløkken:

Kode: Velg alt

while (abs(b-a)/2 > tol)
        c   = (a+b)/2;
        f_c = f(c);
        
        if (f_c == 0)
            % Returner c som rot
            break;
        end
        
        if (sign(f_c) ~= sign(f_a)) 
            b = c;
        else
            a   = c;
            f_a = f_c;
        end
end
Her er f funksjonsuttrykket, tol gir ønsket presisjon og sign(..) gir hvorvidt verdien er positiv eller negativ.