Come trovare tutte le radici di unequazione in Matlab? Ho provato e mi ha dato solo una delle radici.
Ad esempio: la mia equazione è $ F (x) = 0 $ dove
F(x) = (cos(7*x)).*exp(-2*x.^2).*(1-2*(x.^2))
Commenti
- Controlla la tua equazione – Non ' penso che sia valida la sintassi Matlab (punto solitario).
- Cosa hai provato in MATLAB?
Risposta
Prima di provare a trovare tutto delle radici di questa funzione in MATLAB Penso che valga la pena capire che ha infinite radici a causa del inclusione del termine $ \ cos () $. Inoltre, in questo caso è facile trovare analiticamente le radici della funzione:
Le radici sono definite da $$ \ cos (7x) \ cdot \ exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Quindi abbiamo $$ \ cos (7x) = 0 \ text {o} \ exp (-2x ^ 2) = 0 \ text {o} (1-2x ^ 2) = 0, $$ che restituisce $$ 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 \}. $$
Per rispondere alla tua domanda in in senso più generale, un modo semplice per cercare più di una radice in MATLAB sarebbe usare la funzione fzero
con molte diverse ipotesi iniziali su un intervallo predefinito. Non è garantito che trovi tutti gli zeri, ma passando un intervallo a fzero
puoi almeno garantire che troverai zeri dove la funzione cambia segno su quellintervallo. Scegliendo intervalli abbastanza piccoli puoi ottenere ottimi risultati.
Ad esempio, il codice seguente troverà tutte le radici della tua funzione nellintervallo [-10,10]. Se mancano delle radici, puoi aumentare N
per utilizzare intervalli di inizio più (più piccoli) per fzero
. Nota che questo troverà solo le radici dove cambia il segno.
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")
* Tieni presente che questo metodo (e la maggior parte dei metodi numerici) non funzionerà per $ | x | $ maggiore di ~ 19,3 per questa funzione. Questo perché $ \ exp (-2 (19.4) ^ 2) $ è uguale a 0 con numeri a doppia precisione.
Risposta
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
Oppure, se la tua versione di Matlab è recente, puoi farlo
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_)