Cum se găsesc toate rădăcinile unei ecuații în Matlab? Am încercat și mi-a dat doar una dintre rădăcini.
De exemplu: ecuația mea este $ F (x) = 0 $ unde
F(x) = (cos(7*x)).*exp(-2*x.^2).*(1-2*(x.^2))
Comentarii
- Vă rugăm să vă verificați ecuația – nu ' nu cred că este valabilă sintaxa Matlab (punct singuratic).
- Ce ați încercat în MATLAB?
Răspundeți
Înainte de a încerca să găsiți toate a rădăcinilor acestei funcții în MATLAB Cred că merită să înțelegem că are infinit de multe rădăcini datorită includerea termenului $ \ cos () $. În plus, este ușor să găsiți rădăcinile funcției analitice în acest caz:
Rădăcinile sunt definite de $$ \ cos (7x) \ cdot \ exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Deci avem $$ \ cos (7x) = 0 \ text {sau} \ exp (-2x ^ 2) = 0 \ text {sau} (1-2x ^ 2) = 0, $$ care dă $$ 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 \}. $$
Pentru a răspunde la întrebarea dvs. în un sens mai general, o modalitate simplă de a căuta mai mult de o rădăcină în MATLAB ar fi utilizarea funcției fzero
cu multe presupuneri de pornire diferite într-o anumită gamă predefinită. Acest lucru nu este garantat pentru a găsi toate zerourile, dar trecând un interval la fzero
puteți garanta cel puțin că veți găsi zerouri în care funcția modifică semnul pe acel interval. Alegând intervale suficient de mici puteți obține rezultate foarte bune.
De exemplu, următorul cod va găsi toate rădăcinile funcției dvs. pe intervalul [-10,10]. Dacă s-a ratat orice rădăcină, puteți crește N
pentru a utiliza mai multe intervale de pornire (mai mici) pentru fzero
. Rețineți că acest lucru va găsi rădăcini doar în cazul în care semnul se modifică.
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")
* Rețineți că această metodă (și majoritatea metodelor numerice) nu va funcționa pentru $ | x | $ mai mare de ~ 19,3 pentru această funcție. Acest lucru se datorează faptului că $ \ exp (-2 (19.4) ^ 2) $ este egal cu 0 cu numere cu precizie dublă.
Răspuns
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
Sau dacă versiunea dvs. de Matlab este recentă, puteți face
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_)