Hoe vind ik alle wortels van een vergelijking in Matlab? Ik heb het geprobeerd en het gaf me slechts een van de wortels.
Bijvoorbeeld: mijn vergelijking is $ F (x) = 0 $ waarbij
F(x) = (cos(7*x)).*exp(-2*x.^2).*(1-2*(x.^2))
Reacties
- Controleer alstublieft uw vergelijking – ik denk niet dat ' niet dat dit een geldige Matlab-syntaxis is (eenzame punt).
- Wat heb je het geprobeerd in MATLAB?
Antwoord
Voordat je alle van de wortels van deze functie in MATLAB. Ik denk dat het de moeite waard is te begrijpen dat het oneindig veel wortels heeft vanwege de opname van de $ \ cos () $ term. Bovendien is het in dit geval gemakkelijk om de wortels van de functie analytisch te vinden:
De wortels worden gedefinieerd door $$ \ cos (7x) \ cdot \ exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Dus we hebben $$ \ cos (7x) = 0 \ text {of} \ exp (-2x ^ 2) = 0 \ text {of} (1-2x ^ 2) = 0, $$ wat $$ x = \ left \ {\ left (n + \ frac {1} {2} \ right) \ dfrac {\ pi} {7} oplevert: n \ in \ mathbb {Z} \ right \} \ cup \ emptyset \ cup \ left \ {\ pm \ sqrt {1/2} \ right \}. $$
Om uw vraag te beantwoorden in een meer algemene zin, een eenvoudige manier om naar meer dan één wortel in MATLAB te zoeken, zou zijn om de functie fzero
te gebruiken met veel verschillende startschattingen over een bepaald vooraf gedefinieerd bereik. Dit is niet gegarandeerd dat alle nullen worden gevonden, maar door een interval door te geven aan fzero
kun je op zijn minst garanderen dat je nullen zult vinden waar de functie van teken verandert op dat interval. Door intervallen te kiezen die klein genoeg zijn, kunt u zeer goede resultaten behalen.
De volgende code zoekt bijvoorbeeld alle wortels van uw functie op het interval [-10,10]. Als er wortels zijn gemist, kunt u N
verhogen om meer (kleinere) startintervallen te gebruiken voor fzero
. Merk op dat dit alleen wortels zal vinden waar het teken verandert.
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")
* Merk op dat deze methode (en de meeste numerieke methoden) niet zal werken voor $ | x | $ groter dan ~ 19,3 voor deze functie. Dit komt doordat $ \ exp (-2 (19.4) ^ 2) $ gelijk is aan 0 met getallen met dubbele precisie.
Answer
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
Of als uw versie van Matlab recent is, kunt u
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_)