¿Cómo encontrar todas las raíces de una ecuación en Matlab? Lo intenté y me dio solo una de las raíces.
Por ejemplo: mi ecuación es $ F (x) = 0 $ donde
F(x) = (cos(7*x)).*exp(-2*x.^2).*(1-2*(x.^2))
Comentarios
- Por favor, revise su ecuación – No ' creo que sea una sintaxis válida de Matlab (punto único).
- Qué ¿probaste en MATLAB?
Responder
Antes de intentar encontrar todos de las raíces de esta función en MATLAB Creo que vale la pena entender que tiene infinitas raíces debido a inclusión del término $ \ cos () $. Además, es fácil encontrar las raíces de la función analíticamente en este caso:
Las raíces están definidas por $$ \ cos (7x) \ cdot \ exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Entonces tenemos $$ \ cos (7x) = 0 \ text {o} \ exp (-2x ^ 2) = 0 \ text {o} (1-2x ^ 2) = 0, $$ lo que da $$ 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 \}. $$
Para responder a su pregunta en En un sentido más general, una forma sencilla de buscar más de una raíz en MATLAB sería usar la función fzero
con muchas suposiciones iniciales diferentes en un rango predefinido. No se garantiza que esto encuentre todos los ceros, pero al pasar un intervalo a fzero
, al menos puede garantizar que encontrará ceros donde la función cambia de signo en ese intervalo. Al elegir intervalos lo suficientemente pequeños, puede obtener muy buenos resultados.
Por ejemplo, el siguiente código encontrará todas las raíces de su función en el intervalo [-10,10]. Si se omitió alguna raíz, puede aumentar N
para usar más intervalos de inicio (más pequeños) para fzero
. Tenga en cuenta que esto solo encontrará raíces donde cambia el signo.
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")
* Tenga en cuenta que este método (y la mayoría de los métodos numéricos) no funcionará para $ | x | $ mayor que ~ 19,3 para esta función. Esto se debe a que $ \ exp (-2 (19.4) ^ 2) $ es igual a 0 con números de doble precisión.
Respuesta
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
O si su versión de Matlab es reciente, puede hacer
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_)