Hogyan lehet megtalálni az egyenlet összes gyökerét a Matlab-ban? Megpróbáltam, és ez adta nekem csak az egyik gyökeret.
Például: az egyenletem $ F (x) = 0 $, ahol
F(x) = (cos(7*x)).*exp(-2*x.^2).*(1-2*(x.^2))
megjegyzések
- Kérjük, ellenőrizze az egyenletét – nem hiszem, hogy ' szerintem érvényes Matlab-szintaxis (egyetlen pont).
- Mi megpróbáltad a MATLAB-ban?
Válasz
Mielőtt megpróbálnád megtalálni az összes a függvény gyökerei a MATLAB-ban. Azt hiszem, érdemes megérteni, hogy végtelen sok gyökere van a a $ \ cos () $ kifejezés beillesztése. Ezenkívül ebben az esetben könnyű analitikusan megtalálni a függvény gyökereit:
A gyökereket a $$ \ cos (7x) \ cdot \ határozza meg exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Tehát van $$ \ cos (7x) = 0 \ text {vagy} \ exp (-2x ^ 2) = 0 \ text {vagy} (1-2x ^ 2) = 0, $$, amely $$ x = \ left \ {\ left (n + \ frac {1} {2} \ right) \ dfrac {\ pi} {7} értéket ad: n \ in \ mathbb {Z} \ right \} \ cup \ emptyyset \ cup \ left \ {\ pm \ sqrt {1/2} \ right \}. $$
A kérdés megválaszolásához általánosabb értelemben, egynél több gyökér keresésének egyszerű módja a MATLAB-ban az lenne, ha a fzero
függvényt használnánk, sokféle kezdő találgatással, előre meghatározott tartományban. Ez nem garantáltan megtalálja az összes nullát, de ha átad egy intervallumot a fzero
-nek, akkor legalább garantálja, hogy olyan nullákat talál, ahol a függvény előjelet változtat ezen az intervallumon. Elég kicsi intervallumok kiválasztásával nagyon jó eredményeket érhet el.
Például a következő kód megtalálja a függvény összes gyökerét a [-10,10] intervallumon. Ha valamelyik gyökér hiányzott, növelheti a N
számot, hogy több (kisebb) kezdési intervallumot használjon a fzero
számára. Ne feledje, hogy ez csak a gyökereket fogja megtalálni, ahol a jel megváltozik.
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")
* Ne feledje, hogy ez a módszer (és a legtöbb numerikus módszer) nem fog működni $ | x | $ nagyobb, mint ~ 19,3 ennél a funkciónál. Ez azért van, mert a $ \ exp (-2 (19.4) ^ 2) $ értéke dupla pontosságú számokkal 0.
Válasz
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
Vagy ha a Matlab verziója legújabb, akkor megteheti
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_)