Hvordan finner du alle røttene til en ligning i Matlab? Jeg prøvde, og det ga meg bare en av røttene.
For eksempel: min ligning er $ F (x) = 0 $ hvor
F(x) = (cos(7*x)).*exp(-2*x.^2).*(1-2*(x.^2))
Kommentarer
- Vennligst sjekk ligningen din – Jeg tror ikke ' Jeg tror ikke det er gyldig Matlab-syntaks (ensom prikk).
- Hva prøvde du i MATLAB?
Svar
Før du prøver å finne alt av røttene til denne funksjonen i MATLAB Jeg synes det er verdt å forstå at det har uendelig mange røtter på grunn av inkludering av termen $ \ cos () $. I tillegg er det enkelt å finne røttene til funksjonen analytisk i dette tilfellet:
Røttene er definert av $$ \ cos (7x) \ cdot \ exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Så vi har $$ \ cos (7x) = 0 \ text {eller} \ exp (-2x ^ 2) = 0 \ text {eller} (1-2x ^ 2) = 0, $$ som gir $$ x = \ left \ {\ left (n + \ frac {1} {2} \ right) \ dfrac {\ pi} {7}: n \ in \ mathbb {Z} \ right \} \ cup \ emptyset \ cup \ left \ {\ pm \ sqrt {1/2} \ right \}. $$
For å svare på spørsmålet ditt i en mer generell forstand, en enkel måte å lete etter mer enn en rot i MATLAB ville være å bruke fzero
-funksjonen med mange forskjellige startgissinger over noe forhåndsdefinert område. Dette er ikke garantert å finne alle nuller, men ved å sende et intervall til fzero
kan du i det minste garantere at du finner nuller der funksjonen endrer tegn på det intervallet. Ved å velge små nok intervaller kan du oppnå veldig gode resultater.
For eksempel vil følgende kode finne alle røttene til funksjonen din i intervallet [-10,10]. Hvis noen røtter ble savnet, kan du øke N
for å bruke flere (mindre) startintervaller for fzero
. Merk at dette bare vil finne røtter der tegnet endres.
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")
* Merk at denne metoden (og de fleste numeriske metoder) ikke vil fungere for $ | x | $ større enn ~ 19,3 for denne funksjonen. Dette er fordi $ \ exp (-2 (19.4) ^ 2) $ tilsvarer 0 med doble presisjonstall.
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 versjon av Matlab er nylig, kan du gjø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_)