Jak najít všechny kořeny rovnice v Matlabu?

Jak najít všechny kořeny rovnice v Matlabu? Zkusil jsem to a dalo mi to jen jeden z kořenů.

Například: moje rovnice je $ F (x) = 0 $ kde

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

Komentáře

  • Zkontrolujte prosím rovnici – ' si nemyslím, že je to platná syntaxe Matlabu (osamělá tečka).
  • Co zkusili jste to v MATLABu?

odpověď

Než se pokusíte najít všechny kořenů této funkce v MATLABu si myslím, že stojí za to pochopit, že má nekonečně mnoho kořenů kvůli zahrnutí termínu $ \ cos () $. Navíc je v tomto případě snadné analyticky najít kořeny funkce:

Kořeny jsou definovány $$ \ cos (7x) \ cdot \ exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Takže máme $$ \ cos (7x) = 0 \ text {nebo} \ exp (-2x ^ 2) = 0 \ text {or} (1-2x ^ 2) = 0, $$ což dává $$ 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 \}. $$

Odpověď na vaši otázku v obecnější smysl, jednoduchý způsob, jak hledat v MATLABu více než jeden kořen, by bylo použití funkce fzero s mnoha různými počátečními odhady v určitém předdefinovaném rozsahu. Není zaručeno, že najdete všechny nuly, ale předáním intervalu do fzero můžete alespoň zaručit, že najdete nuly, kde funkce změní znaménko na tomto intervalu. Výběrem dostatečně malých intervalů můžete dosáhnout velmi dobrých výsledků.

Následující kód například najde všechny kořeny vaší funkce v intervalu [-10,10]. Pokud by některý kořen chyběl, můžete zvýšit N použít více (menších) počátečních intervalů pro fzero. Všimněte si, že toto najde pouze kořeny, kde se změní znaménko.

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

* Upozorňujeme, že tato metoda (a většina numerických metod) nebude fungovat pro $ | x | $ větší než ~ 19,3 pro tuto funkci. Důvodem je, že $ \ exp (-2 (19,4) ^ 2) $ se rovná 0 s dvojitou přesností.

Odpovědět

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 

Nebo pokud je vaše verze Matlabu nejnovější, můžete udělat

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *