Hvordan finder du alle ligningsrødder i Matlab?

Hvordan finder man alle rødderne i en ligning i Matlab? Jeg prøvede, og det gav mig bare en af rødderne.

For eksempel: min ligning er $ F (x) = 0 $ hvor

 F(x) = (cos(7*x)).*exp(-2*x.^2).*(1-2*(x.^2)) 

Kommentarer

  • Kontroller din ligning – Jeg tror ikke ' Jeg synes ikke, det er gyldig Matlab-syntaks (ensom prik).
  • Hvad prøvede du i MATLAB?

Svar

Før du prøver at finde alle af rødderne til denne funktion i MATLAB Jeg synes, det er værd at forstå, at det har uendeligt mange rødder på grund af inkludering af termen $ \ cos () $. Derudover er det let at finde funktionens rødder analytisk i dette tilfælde:

Rødderne er defineret af $$ \ cos (7x) \ cdot \ exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Så vi har $$ \ cos (7x) = 0 \ tekst {eller} \ exp (-2x ^ 2) = 0 \ tekst {eller} (1-2x ^ 2) = 0, $$ som giver $$ x = \ venstre \ {\ venstre (n + \ frac {1} {2} \ højre) \ dfrac {\ pi} {7}: n \ in \ mathbb {Z} \ right \} \ cup \ emptyset \ cup \ left \ {\ pm \ sqrt {1/2} \ right \}. $$

For at besvare dit spørgsmål i en mere generel forstand, en enkel måde at lede efter mere end en rod i MATLAB ville være at bruge fzero -funktionen med mange forskellige startgætter over et foruddefineret område. Dette kan ikke garanteres at finde alle nuller, men ved at sende et interval til fzero kan du i det mindste garantere, at du finder nuller, hvor funktionen ændrer tegn på dette interval. Ved at vælge små nok intervaller kan du opnå meget gode resultater.

For eksempel finder følgende kode alle rødderne til din funktion i intervallet [-10,10]. Hvis nogen rødder blev savnet, kunne du øge N for at bruge flere (mindre) startintervaller for fzero. Bemærk, at dette kun finder rødder, hvor tegnet ændres.

F = @(x) cos(7*x).*exp(-2*x.^2).*(1-2*x.^2); interval = [-10, 10]; N = 500; start_pts = linspace(interval(1),interval(2),N); found_roots = []; for i=1:numel(start_pts)-1 try found_roots(end+1) = fzero(F,[start_pts(i),start_pts(i+1)]); end end % Plot results: figure, hold on fplot(F,interval,1e-4) plot(found_roots,zeros(size(found_roots)),"rx") 

* Bemærk, at denne metode (og de fleste numeriske metoder) ikke fungerer for $ | x | $ større end ~ 19,3 for denne funktion. Dette skyldes, at $ \ exp (-2 (19.4) ^ 2) $ er lig med 0 med dobbelt præcisionstal.

Svar

syms x eq=cos(7*x)*exp(-2*x^2)*(1-2*x^2); solve(eq==0,x) 

ans =

 pi/14 2^(1/2)/2 -2^(1/2)/2 

Eller hvis din version af Matlab er ny, kan du gøre

evalin(symengine,"solve(cos(7*x)*exp(-2*x^2)*(1-2*x^2)=0,x)") {-2^(1/2)/2, 2^(1/2)/2} union Dom::ImageSet(pi/14 + (pi*k)/7, k, Z_) 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *