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