Finne alle svar på en likning i matlab

Her kan du stille spørsmål vedrørende problemer og oppgaver i matematikk på høyskolenivå. Alle som har kunnskapen er velkommen med et svar. Men, ikke forvent at admin i matematikk.net er spesielt aktive her.

Moderatorer: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa

Svar
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
Skogmus
Noether
Noether
Innlegg: 46
Registrert: 21/05-2014 19:04

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.
Svar