WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

jacbi-matrix über finite differenzen berechnen

 

lotte

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2011, 13:28     Titel: jacbi-matrix über finite differenzen berechnen
  Antworten mit Zitat      
hallo zusammen,
ich habe einen levenberg-marquardt-algorithmus und möchte diesen ein wenig abändern. hier wird die jacobi-matrix analytisch berechnet. da ich aber, anders als hier, recht komplizierte funktionen verwenden möchte, würde ich dei jacobi-matrix gerne mittels finite differenzen berechnen. allerdings tu ich mich ein wenig schwer. ich habe es schon mit jacobian() versucht, aber da bekomme ich folgende fehlermeldung: "Undefined function or method 'jacobian' for input arguments of type 'double'."
die formel für fd lautet ja: 1/h * (f(x+h*e)-f(x)), aber ich will ja nach meinen parametern ableiten...
ich steh völlig auf dem schlauch. vielleicht kann mir ja jemand weiterhelfen...?

gruß lotte

hier ist mein code:
Code:
function levenberg_marquardt
clear all; close all; clc;
 
a = 100;
b = 102;
x = [0:0.1:2*pi]';
y = a.*cos(b.*x) + b.*sin(a.*x);
y_input = y + 5.*rand(length(x), 1);        

% erste Schätzung der Parameter
a0 = 100.5;
b0 = 102.5;
y_init = a0.*cos(b0.*x) + b0.*sin(a0.*x);
Ndata = length(y_input);
Nparameters = 2;
n_iter = 100;          
lamda = 0.01;          
updateJ = 1;
a_est = a0;
b_est = b0;

for it = 1:n_iter
   
    if updateJ == 1
        % Auswertung der Jacobi-Matrix an den momentanen Parametern (a_est,
        % b_est)
        J = zeros(Ndata, Nparameters);      
       
        for i = 1:length(x)
            J(i, :) = [-cos(b_est.*x(i)) - (b_est.*cos(a_est.*x(i)).*x(i)) (a_est.*sin(b_est.*x(i)).*x(i)) - sin(a_est.*x(i))];
        end
       
        % Auswertung des Totalen Fehlers (Abstand) an den momentanen
        % Parametern
        y_est = a_est.*cos(b_est.*x) + b_est.*sin(a_est.*x);
        d = y_input - y_est;
       
        % Berechnung der approximierten Hesse-Matrix
        H = J'*J;
       
        if it == 1              
            e = dot(d, d);      
        end
       
    end
   
    % fügt den Dämpfungsfaktor zur Hesse-Matrix hinzu
    H_lm = H + (lamda.*eye(Nparameters, Nparameters));      
   
    % Berechnung der aktualisierten Parameter
    dp = -inv(H_lm)*(J'*d(:));          
    a_lm = a_est + dp(1);
    b_lm = b_est + dp(2);
   
    % Auswertung des Totalen Fehlers (Abstand) an den neuen Parametern
    y_est_lm = a_lm.*cos(b_lm.*x) + b_lm.*sin(a_lm.*x);
    d_lm = y_input - y_est_lm;
    e_lm = dot(d_lm, d_lm);
   
    % Ist der Fehler der aktualisierten Parameter kleiner als der vorherige, dann
    % mach sie zu den momentanen Parametern und reduziere den Dämpfungsfaktor
    if e_lm < e
        lamda = lamda/10;
        a_est = a_lm;
        b_est = b_lm;
        e = e_lm;
        disp(e);            
        updateJ = 1;
    else    % sonst erhöhe den Dämpfungsfaktor
        updateJ = 0;
        lamda = lamda.*10;
    end
         
end


lotte

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2011, 13:46     Titel:
  Antworten mit Zitat      
vielleicht hab ich es grad...

könnte ich mir mein y_init so definieren:
Code:
function f = y_init(x, a0,b0)
        f = a0.*cos(b0.*x) + b0.*sin(a0.*x);
    end

und dann die jacobi-matrix so berechnen:
Code:
J = zeros(Ndata, Nparameters);      
       
        for j = 1:Nparameters              
            e = zeros(Nparameters, 1);    
            e(j) = 1.0;
            J(:, j) = -(1/h).*(y_init(x, a_est + h.*e, b_est + h.*e) - y_init(x, a_est, b_est));
        end

geht das so?
oder hab ich einen denkfehler?
 
timber

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2011, 11:51     Titel:
  Antworten mit Zitat      
hi,

wie ist das, müsste deine jacobi-matrix nicht quadratisch sein?

gruß
 
lotte

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2011, 08:29     Titel:
  Antworten mit Zitat      
hallo timber,

wieso denn das? ist die jacobi-matrix nicht definiert als
J=[dfi/dxj] für i=1,...,m und j=1,...,n?

lotte
 
lotte

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2011, 18:48     Titel:
  Antworten mit Zitat      
hi,

jetzt hast du mich völlig verunsichert timber. ich weiß es nicht genau...
kann mir denn irgendjemand weiterhelfen???

muss bei meinem algorithmus die jacobi-matrix quadratisch sein oder nicht?

lotte
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.