Como encontrar todas as raízes da equação no Matlab?

Como encontrar todas as raízes de uma equação no Matlab? Eu tentei e isso me deu apenas uma das raízes.

Por exemplo: minha equação é $ F (x) = 0 $ onde

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

Comentários

  • Verifique sua equação – Não ' não acho que seja uma sintaxe válida do Matlab (ponto solitário).
  • O quê você tentou no MATLAB?

Resposta

Antes de tentar encontrar todos das raízes desta função no MATLAB, acho que vale a pena entender que ela tem infinitamente muitas raízes devido ao inclusão do termo $ \ cos () $. Além disso, é fácil encontrar as raízes da função analiticamente neste caso:

As raízes são definidas por $$ \ cos (7x) \ cdot \ exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Portanto, temos $$ \ cos (7x) = 0 \ texto {ou} \ exp (-2x ^ 2) = 0 \ texto {ou} (1-2x ^ 2) = 0, $$ que 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 \}. $$

Para responder à sua pergunta em em um sentido mais geral, uma maneira simples de procurar mais de uma raiz no MATLAB seria usar a função fzero com muitas suposições iniciais diferentes em um intervalo pré-definido. Isso não é garantido para encontrar todos os zeros, mas ao passar um intervalo para fzero, você pode pelo menos garantir que encontrará zeros onde a função muda de sinal nesse intervalo. Ao escolher intervalos pequenos o suficiente, você pode obter resultados muito bons.

Por exemplo, o código a seguir encontrará todas as raízes de sua função no intervalo [-10,10]. Se alguma raiz foi perdida, você pode aumentar N para usar mais intervalos iniciais (menores) para fzero. Observe que isso só encontrará raízes onde o sinal muda.

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

* Observe que este método (e a maioria dos métodos numéricos) não funcionará para $ | x | $ maior que ~ 19,3 para esta função. Isso ocorre porque $ \ exp (-2 (19,4) ^ 2) $ é igual a 0 com números de precisão dupla.

Resposta

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 

Ou se sua versão do Matlab for recente, você pode fazer

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *