Jak znaleźć wszystkie pierwiastki równania w Matlabie?

Jak znaleźć wszystkie pierwiastki równania w Matlabie? Spróbowałem i dało mi to tylko jeden z korzeni.

Na przykład: moje równanie to $ F (x) = 0 $ gdzie

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

Komentarze

  • Sprawdź swoje równanie – nie ' nie uważam, że to poprawna składnia Matlaba (samotna kropka).
  • Co czy próbowałeś w MATLABie?

Odpowiedź

Zanim spróbujesz znaleźć wszystko korzeni tej funkcji w MATLAB-ie Myślę, że warto zrozumieć, że ma nieskończenie wiele korzeni ze względu na włączenie terminu $ \ cos () $. Dodatkowo, łatwo jest znaleźć analitycznie pierwiastki funkcji w tym przypadku:

Korzenie są zdefiniowane przez $$ \ cos (7x) \ cdot \ exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Czyli mamy $$ \ cos (7x) = 0 \ text {or} \ exp (-2x ^ 2) = 0 \ text {or} (1-2x ^ 2) = 0, $$, co daje $$ 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 \}. $$

Aby odpowiedzieć na pytanie w W bardziej ogólnym sensie prostym sposobem wyszukiwania więcej niż jednego pierwiastka w MATLAB byłoby użycie funkcji fzero z wieloma różnymi początkowymi domysłami w pewnym wstępnie zdefiniowanym zakresie. Nie gwarantuje to znalezienia wszystkich zer, ale przekazując interwał do fzero, możesz przynajmniej zagwarantować, że znajdziesz zera, w których funkcja zmienia znak w tym przedziale. Wybierając odpowiednio małe przedziały, można uzyskać bardzo dobre wyniki.

Na przykład poniższy kod znajdzie wszystkie pierwiastki funkcji w przedziale [-10,10]. Jeśli pominięto jakiekolwiek korzenie, możesz zwiększyć N, aby użyć więcej (mniejszych) odstępów początkowych dla fzero. Zwróć uwagę, że spowoduje to znalezienie korzeni tylko w miejscach, w których zmienia się znak.

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

* Zauważ, że ta metoda (i większość metod numerycznych) nie będzie działać dla $ | x | $ większe niż ~ 19,3 dla tej funkcji. Dzieje się tak, ponieważ $ \ exp (-2 (19.4) ^ 2) $ równa się 0 z liczbami o podwójnej precyzji.

Odpowiedź

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 

Lub jeśli Twoja wersja Matlab jest najnowsza, możesz zrobić

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *