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