Hur hittar jag alla rötter i en ekvation i Matlab? Jag försökte och det gav mig bara en av rötterna.
Till exempel: min ekvation är $ F (x) = 0 $ där
F(x) = (cos(7*x)).*exp(-2*x.^2).*(1-2*(x.^2))
Kommentarer
- Kontrollera din ekvation – Jag tycker inte ' tänker inte att det är giltigt Matlab-syntax (ensam prick).
- Vad försökte du i MATLAB?
Svar
Innan du försöker hitta alla av rötterna för denna funktion i MATLAB Jag tycker att det är värt att förstå att det har oändligt många rötter på grund av inkludering av termen $ \ cos () $. Dessutom är det enkelt att hitta funktionens rötter i detta fall:
Rötterna definieras 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, $$ vilket ger $$ 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 \}. $$
För att svara på din fråga i en mer allmän känsla, ett enkelt sätt att leta efter mer än en rot i MATLAB skulle vara att använda fzero
-funktionen med många olika startgissningar över något fördefinierat intervall. Detta kan inte garanteras att hitta alla nollor, men genom att skicka ett intervall till fzero
kan du åtminstone garantera att du hittar nollor där funktionen ändrar tecken på det intervallet. Genom att välja tillräckligt små intervaller kan du få mycket bra resultat.
Till exempel kommer följande kod att hitta alla rötter till din funktion i intervallet [-10,10]. Om några rötter missades kan du öka N
för att använda fler (mindre) startintervall för fzero
. Observera att detta bara hittar rötter där tecknet ändras.
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")
* Observera att denna metod (och de flesta numeriska metoder) inte fungerar för $ | x | $ större än ~ 19,3 för denna funktion. Detta beror på att $ \ exp (-2 (19.4) ^ 2) $ är lika med 0 med dubbla precisionsnummer.
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 om din version av Matlab är ny kan du göra
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_)