Wie Newton-Raphson-Methode in matlab zu finden, eine Gleichung root?
Ich bin ein neuer Benutzer von MATLAB. Ich will um den Wert zu finden, dass macht f(x) = 0
mit der Newton-Raphson-Methode. Ich habe versucht, den code schreibt, aber es scheint, dass es schwierig zu implementieren Newton-Raphson-Methode. Dies ist, was ich habe, so weit:
function x = newton(x0, tolerance)
tolerance = 1.e-10;
format short e;
Params = load('saved_data.mat');
theta = pi/2;
zeta = cos(theta);
I = eye(Params.n,Params.n);
Q = zeta*I-Params.p*Params.p';
% T is a matrix(5,5)
Mroot = Params.M.^(1/2); %optimization
T = Mroot*Q*Mroot;
% Find the eigenvalues
E = real(eig(T));
% Find the negative eigenvalues
% Find the smallest negative eigenvalue
gamma = min(E);
% Now solve for lambda
M_inv = inv(Params.M); %optimization
zm = Params.zm;
x = x0;
err = (x - xPrev)/x;
while abs(err) > tolerance
xPrev = x;
x = xPrev - f(xPrev)./dfdx(xPrev);
% stop criterion: (f(x) - 0) < tolerance
err = f(x);
end
% stop criterion: change of x < tolerance % err = x - xPrev;
end
Die oben beschriebene Funktion verwendet wird, etwa so:
% Calculate the functions
Winv = inv(M_inv+x.*Q);
f = @(x)( zm'*M_inv*Winv*M_inv*zm);
dfdx = @(x)(-zm'*M_inv*Winv*Q*M_inv*zm);
x0 = (-1/gamma)/2;
xRoot = newton(x0,1e-10);
Also, was ist th in Frage? Sie zeigen nur Ihren code...
Ich muss korrigieren Sie den code, damit es funktioniert.
Welche Art der Ausgabe sind Sie immer auf??? Was sind Ihre Funktionen scheinen nicht zu arbeiten, mit
Es gibt die folgende Fehlermeldung :??? Error using ==> fzero-Funktion Werte im Intervall-Endpunkte müssen endlich sein und echte"".Ich denke, das ist, weil es komplexe Einträge in die Gleichung ein.
können Sie uns zeigen, was
Ich muss korrigieren Sie den code, damit es funktioniert.
Welche Art der Ausgabe sind Sie immer auf??? Was sind Ihre Funktionen scheinen nicht zu arbeiten, mit
fzero()
?Es gibt die folgende Fehlermeldung :??? Error using ==> fzero-Funktion Werte im Intervall-Endpunkte müssen endlich sein und echte"".Ich denke, das ist, weil es komplexe Einträge in die Gleichung ein.
können Sie uns zeigen, was
Params.n
, Params.p
, Params.M
etc sind? Dann sind wir eher in der Lage sein, um Ihnen zu helfen debug-Ihr problem.InformationsquelleAutor user1079331 | 2011-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Frage ist nicht besonders deutlich. Jedoch, Sie benötigen, um zu implementieren, die Wurzel selbst zu finden? Wenn nicht, dann nur mit Hilfe von Matlab eingebauten Funktion
fzero
(nicht basierend auf dem Newton-Raphson).Wenn Sie das tun, müssen Sie Ihre eigene Implementierung des Newton-Raphson-Methode, dann schlage ich vor, eine der Antworten auf Newton Raphsons Methode in Matlab? als Ihren Ausgangspunkt.
Edit: Die folgenden nicht beantworten Ihre Frage, aber ist nur ein Hinweis auf die Codierung Stil.
Ist es nützlich, zu teilen Sie Ihre Programm bis in wiederverwendbare Teile. In diesem Fall ist die Wurzel zu finden sollten getrennt von Ihrer Funktion-Konstruktion. Ich empfehle das schreiben Ihrer Newton-Raphson-Methode in eine separate Datei und rufen Sie diese aus dem Skript, in dem Sie definieren Ihre Funktion und Ihre Ableitung. Ihre Quelle würde dann gucken einige Sache wie:
In
newton.m
Sie hätte Ihre Implementierung der Newton-Raphson-Methode nimmt, die als Argumente der Funktion behandelt, die Sie definieren (f
unddfdx
). Mit Ihrem code gegeben in der Frage, das würde Aussehen wieBemerken, dass ich es vermieden, mit einem unendlichen loop.
Können Sie nicht einfach zerlegen Ihre Eingabe Gleichung in real-und Imaginärteil? Auch kann es hilfreich sein, zu buchstabieren, Ihr problem (was Gleichungen, die Sie verwenden) und reinigen Sie up-code in der Aufgabe (zum Beispiel, wo ist die
end
zu Ihremwhile
- Schleife?).Ich glaube nicht, zerlegen Sie die Eingabe der Gleichung in real-und Imaginärteil.
Ich glaube nicht, zerlegen Sie die Eingabe der Gleichung in real-und Imaginärteil.Die Funktion ist Winv = inv(M_inv+lambda.*Q); newton = zm'M_invWinvM_invzm; Wie Sie sehen, Winv ist ein parameter in der Gleichung einfach nur, und es enthält die variable lambda, sollten wir finden es Wert, stellen Sie die Ableitung der obigen Funktion gleich null ist.Die Ableitung ist :Winv = inv(M_inv+lambda.*Q); newton = -zm'M_invWinvQM_inv*zm;
InformationsquelleAutor Chris