|
|
Lösung nicht linearer Gleichungen mittels Gauss-Newton-Ver. |
|
leo.laza |
Forum-Newbie
|
|
Beiträge: 1
|
|
|
|
Anmeldedatum: 19.06.20
|
|
|
|
Wohnort: Hannover
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 19.06.2020, 12:37
Titel: Lösung nicht linearer Gleichungen mittels Gauss-Newton-Ver.
|
|
|
|
|
Guten Tag,
wie oben bereits erwähnt habe ich ein Problem mit der Lösung eines nicht linearen Gleichungssystem mittels dem Gauß-Newton-Verfahren (Thema Kettenlinie mit punktueller Krafteinwirkung). Die Aufgabe besteht darin, die unbekannten Parameter (7 Stck.) anhand der sieben Gleichungen mittels Gauss-Newton zu Lösen.
Normalerweise wird dieses ja für folgendes verwenden:
"Das Gauß-Newton-Verfahren ist geeignet, iterativ für eine Anzahl von Gleichungen ein Minimum zu finden. Bei der Ausgleichsrechnung wurden die Residuen minimiert. Gleiches geschieht hier mit einer anderen Anwendung. Die nichtlinearen Gleichungen werden wie beim Newton-Verfahren so umgestellt, dass auf der rechten Seite stets null steht. Sie starten mit einem Schätzwert der gesuchten Größen und erhalten für jede Gleichung eine Abweichung, die solange iterativ bearbeitet wird, bis ein (kleines) Abbruchkriterium erfüllt ist." (Zitat, Professor)
Den Code finde ich ebenfalls hier im Forum für eben das oben genannte typische Verfahren zur Approximation bei Vorgabe einer Punktwolke.
Nun habe ich diese ja eben nicht und bin leider ein wenig überfragt wie ich dieses Lösen soll.
Im folgenden lade ich die Syntax welche ich gefunden habe einmal hoch und weiterhin die Gleichungen mit den unbekannten (diese wurden bereits mit der fsolve-Funktion gelöst).
___________________________________________________________________
Lösung fsolve:
_____________________________________________________________________
%Bedinungen aktueller Stand
f =@(x)[x(5)*cosh(x(1))+x(2);
x(6)*cosh((0.7/x(6))+x(3))+x(4)-0.4;
x(5)*cosh((x(7)/x(5))+x(1))+x(2)-x(6)*cosh((x(7)/x(6))+x(3))-x(4);
x(5)+5*(1/2)-x(6);
x(5)*sinh((x(7)/x(5))+x(1))+5*0.866-x(6)*sinh((x(7)/x(6))+x(3));
x(5)*(sinh((x(7)/x(5))+x(1))-sinh(x(1)))+ x(6)*(sinh((0.7/x(6))+x(3))-sinh((x(7)/x(6))+x(3)))-1;
x(5)*(sinh((x(7)/x(5))+x(1))-sinh(x(1)))-0.15]
%-------------------------------------
%-------------------------------------
% Schätzwerte für x(1) bis x(7)
x0 =[-0.88,-0.37,-0.88,-0.37,0.26,0.26,0.15]
%-------------------------------------
% Ausführung fsolve
options = optimoptions('fsolve','Display','iter');
mitGewicht = fsolve(f,x0,options);
_____________________________________________________________________
Nun der Code aus dem Netzt:
_____________________________________________________________________
function [unknowns,steps,S] = GaussNewtonAlgorithmus()
close all
clear all
clc
format long
tol = 1e-6; % Toleranz
maxstep = 500; % Festlegung der max. Iteration
y = [1 0.881 0.619 0.069 -0.312 -0.55 -0.463 -0.317 -0.123 0.072 0.227 0.196 0.17 0.079 -0.004 -0.079 -0.113];
t = [0 0.6 1.2 1.8 2.4 3.0 3.6 4.2 4.8 5.4 6.0 6.6 7.2 7.8 8.4 9.0 9.6];
p = [1;0.5;1;1];
m = length(t); % Anzahl an Zeilen
n = length(p); % Anzahl an Spalten
pold = p; % Erreichen der Genauigkeit
for k=1:maxstep % Festlegung der Iteration
for i=1:m
for j=1:n
J(i,j) = df(t(i),p(1,1),p(2,1),p(3,1),p(4,1),j);
JT(j,i) = J(i,j);
end
end
S = 0;
for i=1:m
r(i,1) = (p(1,1)*exp(-p(2,1)*t(i))*sin(p(3,1)*t(i)+p(4,1)))-y(i);
S = r(i,1)^2;
end
p = pold-(JT*J)\(JT*r);
unknowns = p;
err(k) = p(1,1)-pold(1,1); % Fehlerberechnung
if (abs(err(k)) <= tol);
break
end
pold = p; % Par. entsprechen Genauigkeit
end
steps = k;
for i=1:m
f(i) = (p(1,1)*exp(-p(2,1)*t(i))*sin(p(3,1)*t(i)+p(4,1))); % Berechnung der Funktionswerte
end
% -------------------------------------------------------------------------
% Grafische Darstellung der Ergebnisse
% -------------------------------------------------------------------------
hold all;
grid on;
plot(t,y, '*r'); % Plotten der Punktwolke
plot(t,f,'b'); % Plotten der Funktion
% -------------------------------------------------------------------------
% Titel,Legende und Achsenbeschriftung
% -------------------------------------------------------------------------
title('Gauss-Newton-Algorithmus')
xlabel('t [s]')
ylabel('Auslenkung [m]')
legend('data','best-fit')
hold off
% -------------------------------------------------------------------------
% Ausgabe der Parameter a,b&c hinsichtlich "best fit"
% -------------------------------------------------------------------------
a = p(1);
b = p(2);
c = p(3);
d = p(4);
In = k;
str1 = ['Parameter a = ' num2str(p(1))];
str2 = ['Parameter b = ' num2str(p(2))];
str3 = ['Parameter c = ' num2str(p(3))];
str4 = ['Parameter d = ' num2str(p(4))];
str5 = ['Anzahl der Iterationen = ' num2str(k)];
disp(str1)
disp(str2)
disp(str3)
disp(str4)
disp(str5)
% -------------------------------------------------------------------------
% Switchbefehl für Parameter a,b&c / partielle Ableitungen
% -------------------------------------------------------------------------
function value = df(t,a,b,c,d,index)
switch index
case 1
value = exp(-b*t)*sin(c*t+d);% partielle Ableitung nach a
case 2
value = -t*exp(-b*t)*sin(c*t+d)*a; % partielle Ableitung nach b
case 3
value = t*cos(c*t+d)*exp(-b*t)*a; % partielle Ableitung nach c
case 4
value = cos(c*t+d)*exp(-b*t)*a; % partielle Ableitung nach d
end
|
|
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|