Kuinka löytää yhtälön juuret Matlabista?

Kuinka löytää yhtälön kaikki juuret Matlabista? Yritin, ja se antoi minulle vain yhden juurista.

Esimerkiksi: yhtälöni on $ F (x) = 0 $, jossa

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

kommentit

  • Tarkista yhtälösi – en usko, että ' ei mielestäni ole kelvollinen Matlabin syntaksissa (yksi piste).
  • Mitä yrititkö MATLABissa?

Vastaa

Ennen kuin yrität löytää kaikki tämän funktion juurista MATLABissa. Mielestäni on syytä ymmärtää, että sillä on äärettömän monta juurta johtuen $ \ cos () $ -termin sisällyttäminen. Lisäksi funktion juuret on helppo löytää analyyttisesti tässä tapauksessa:

Juuret määrittelee $$ \ cos (7x) \ cdot \ exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Joten meillä on $$ \ cos (7x) = 0 \ text {tai} \ exp (-2x ^ 2) = 0 \ text {tai} (1-2x ^ 2) = 0, $$ joka antaa $$ x = \ left \ {\ left (n + \ frac {1} {2} \ right) \ dfrac {\ pi} {7}: n \ sisään \ mathbb {Z} \ oikea \} \ kuppi \ tyhjennetty \ kuppi \ vasen \ {\ pm \ sqrt {1/2} \ oikea \}. $$

Voit vastata kysymykseesi yleisempi merkitys, yksinkertainen tapa etsiä useampaa kuin yhtä juurta MATLABista olisi käyttää fzero -funktiota, jossa on monia erilaisia alkuarvioita jollakin ennalta määritetyllä alueella. Täältä ei voida taata kaikkien nollien löytämistä, mutta välittämällä väli fzero -kohtaan voit ainakin taata, että löydät nollia, joissa funktio muuttaa merkkiä kyseisellä aikavälillä. Valitsemalla riittävän pienet välit saat erittäin hyviä tuloksia.

Esimerkiksi seuraava koodi löytää toiminnon kaikki juuret väliltä [-10,10]. Jos jokin juurista puuttuu, voit lisätä arvoa N käyttääksesi enemmän (pienempiä) aloitusvälejä kohteelle fzero. Huomaa, että tämä löytää vain juuret, joissa merkki muuttuu.

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

* Huomaa, että tämä menetelmä (ja useimmat numeeriset menetelmät) eivät toimi hintaan $ | x | $ suurempi kuin ~ 19,3 tälle toiminnolle. Tämä johtuu siitä, että $ \ exp (-2 (19.4) ^ 2) $ on yhtä suuri kuin 0 kaksinkertaisen tarkkuuden numeroilla.

Vastaa

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 

Tai jos Matlab-versiosi on uusi, voit tehdä sen

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *