Hogyan lehet megtalálni az egyenlet összes gyökerét a Matlab-ban?

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

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük