Wie finde ich alle Wurzeln der Gleichung in Matlab?

Wie finde ich alle Wurzeln einer Gleichung in Matlab? Ich habe es versucht und es gab mir nur eine der Wurzeln.

Zum Beispiel: Meine Gleichung lautet $ F (x) = 0 $, wobei

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

Kommentare

  • Bitte überprüfen Sie Ihre Gleichung – Ich ' glaube nicht, dass dies eine gültige Matlab-Syntax (einsamer Punkt) ist.
  • Was haben Sie es in MATLAB versucht?

Antwort

Bevor Sie versuchen, alle zu finden der Wurzeln dieser Funktion in MATLAB Ich denke, es lohnt sich zu verstehen, dass unendlich viele Wurzeln hat Einbeziehung des $ \ cos () $ -Terms. Außerdem ist es in diesem Fall einfach, die Wurzeln der Funktion analytisch zu finden:

Die Wurzeln werden durch $$ \ cos (7x) \ cdot \ definiert exp (-2x ^ 2) \ cdot (1-2x ^ 2) = 0. $$ Wir haben also $$ \ cos (7x) = 0 \ text {oder} \ exp (-2x ^ 2) = 0 \ text {oder} (1-2x ^ 2) = 0, $$, was $$ x = \ left \ {\ left (n + \ frac {1} {2} \ right) \ dfrac {\ pi} {7} ergibt: n \ in \ mathbb {Z} \ right \} \ cup \ Emptyset \ cup \ left \ {\ pm \ sqrt {1/2} \ right \}. $$

Um Ihre Frage in zu beantworten Ein allgemeinerer Sinn, eine einfache Möglichkeit, in MATLAB nach mehr als einer Wurzel zu suchen, wäre die Verwendung der Funktion fzero mit vielen verschiedenen Startschätzungen über einen vordefinierten Bereich. Es wird nicht garantiert, dass alle Nullen gefunden werden. Wenn Sie jedoch ein Intervall an fzero übergeben, können Sie zumindest garantieren, dass Sie Nullen finden, bei denen die Funktion das Vorzeichen in diesem Intervall ändert. Wenn Sie ausreichend kleine Intervalle auswählen, können Sie sehr gute Ergebnisse erzielen.

Im folgenden Code werden beispielsweise alle Wurzeln Ihrer Funktion im Intervall [-10,10] gefunden. Wenn Wurzeln fehlen, können Sie N erhöhen, um mehr (kleinere) Startintervalle für fzero zu verwenden. Beachten Sie, dass hier nur Wurzeln gefunden werden, bei denen sich das Vorzeichen ändert.

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

* Beachten Sie, dass diese Methode (und die meisten numerischen Methoden) für $ nicht funktioniert | x | $ größer als ~ 19.3 für diese Funktion. Dies liegt daran, dass $ \ exp (-2 (19.4) ^ 2) $ mit Zahlen mit doppelter Genauigkeit gleich 0 ist.

Antwort

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 

Oder wenn Ihre Version von Matlab aktuell ist, können Sie

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.