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