Hur hittar jag alla rötter av ekvationen i Matlab?

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_) 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *