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

Abbruch Parameteroptimierung

 

Thilo99
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.12.2017, 13:05     Titel: Abbruch Parameteroptimierung
  Antworten mit Zitat      
Hallo zusammen,

ich arbeite gerade an Modellen für die ich bestimmte Parameter benötige. Die Parameter lassen sich nicht direkt ermitteln und werden daher über einen Genetischen Algorithmus bestimmt. Der Aufbau/Code funktioniert auch soweit, jedoch bricht der GA nach einer gewissen Anzahl an Iterationen/Generationen (20 bis 50 Generationen etwa) ab ohne ersichtlichen Grund.. für mich zumindest:)

Aufgrund der Länge kann ich den ganzen Code leider nicht posten und versuche es hier erst mal mit der Fehlermeldung. Vllt hat ja jmd einen Tipp bzw kann mir eine Hilfestellung zum debuggen geben.

Code:
In an assignment  A(:) = B, the number of elements in A and B must be the same.

Error in getsteifigkeit_VR (line 54)
    s(k) = x(IMIN(I));

Error in ZielFkt_GenMaxwell_aE (line 103)
    Err.(Am_st).c_dyn_sim(n,1) = getsteifigkeit_VR(hys_tmp(end-1).x,hys_tmp(end-1).y,AP,Abtastart);

Error in GA_General_Maxwell_aE>@(Parameter)ZielFkt_GenMaxwell_aE(Parameter,Variablen)

Error in GA_globalPop (line 185)
            F = ZielFKT(Parameter);

Error in GA_General_Maxwell_aE (line 82)
[BestIND, Data_GA] = GA_globalPop(Zielfunktion_GenMaxwell, Variablen,...


Ich weiß ist so ein bisschen Abstrakt aber ich hoffe trotzdem, dass ihr mir helfen könnt.

Vielen Dank schon mal und beste Grüße
Thilo
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.12.2017, 20:20     Titel:
  Antworten mit Zitat      
Hallo,

die einzige Empfehlung, die man so geben kann:
Code:

und dann nochmalige Code-Ausführung.

Dann bleibt man in dieser Zeile unmittelbar bevor der Fehler passiert stehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thilo99
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2017, 11:06     Titel:
  Antworten mit Zitat      
Danke für die Rückmeldung und den Tipp Harald!

Ich habe dadurch meiner Meinung nach das Problem eingegrenzt. Der Fehler müsste dann auftreten, wenn der Zufallsgenerator "r" des GA NaN ausspuckt.

Code:
Var_names = Data_GA.Variablen;
Pop.Individuen = [];

for k = 1:numel(Var_names)
    a = table2array(Data_GA.Wertebereiche(k, 1));
    b = table2array(Data_GA.Wertebereiche(k, 2));
   
    % Zufallszahl
    r = (b-a).*rand(NIND,1)+a;
   
    % Eintrag in Struktur
    Pop.Individuen(:, k) = r;
end


Hier dazu mein Wertebereich:

Code:
%% Variablen
Variablen = {'C2','d1', 'd2', 'RM', 'pM'};
% Wertebereiche
Wertebereiche = table();
Wertebereiche{1, {'MIN' 'MAX'}} = [0.5 10];            % C2
Wertebereiche{2, {'MIN' 'MAX'}} = [1e-6 0.01];       % d1
Wertebereiche{3, {'MIN' 'MAX'}} = [1e-6 0.1];       % d2
Wertebereiche{4, {'MIN' 'MAX'}} = [5 15];           % RM
Wertebereiche{5, {'MIN' 'MAX'}} = [0.1 5];           % pM
Wertebereiche.Properties.RowNames = Variablen;  


Die Populationsgröße NIND ist in meinem Fall 20, nur zur Info.

Kommt jmd darauf, wann "r" zu NaN werden kann?

Vielen Dank und beste Grüße
Thilo
Private Nachricht senden Benutzer-Profile anzeigen
 
Thilo99
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2017, 11:38     Titel:
  Antworten mit Zitat      
.. bzw. in der Mutation könnte der Fehler auch stecken:
mPopChilds.Individuen(k, m) könnte auch NaN produzieren. Leider finde ich auch hier den Fehler nicht auf anhieb und wäre daher um Hilfe dankbar:)


Code:
%% Mutation
mPopChilds.Individuen = PopChilds.Individuen;

switch Methode
    case 'Mutation1'
        if nargin == 3
            v = 0;          % separierbare Zielfunktion
            fk = 16;        % Mutationspräzision
            r = 0.1;        % Mutationsbereich 10% des Definitionsbereichs
        else
            v = Options.Verteilung;                 % Mutationsverteilung (auf andere Variablen)
            fk = Options.Praezision(GEN, MAXGEN);   % Mutationspräzision
            r = Options.rBereich;                   % Mutationsbereich
        end
        % Anzahl Variablen
        Nvar = size(PopChilds.Individuen, 2);
        for k = 1:size(PopChilds.Individuen, 1);
            % Mutationswahrscheinlichkeit
            p = ceil(Nvar*rand(1,Nvar));
            p(p>1) = 0;
            for n = find(p) % Schleife zufällig ausgewählter, zu mutierende Variablen
                % Indizierung bestimmen ([n, n-1, n+1, n-2, n+2, ...])
                j = n;
                for o=1:Nvar-1
                    j = [j, j(end)+(-1)^o*o];
                end
                j(j>Nvar) = j(j>Nvar)-Nvar;
                j(j<1) = j(j<1)+Nvar;
                for m = j      % Schleife Variablen
                    % relative Schrittweite
                    a = 2^(-fk*rand(1));
                    % Schrittrichtung
                    s = sign(2*rand(1)-1);
                    % maximal möglicher Schritt im Definitionsbereich von Elter 1
                    rspann = Wertebereiche{m, 2} - Wertebereiche{m, 1};
                    rmax = r*rspann;
                    % Durchführung der Mutation
                    newVar = PopChilds.Individuen(k, m) +  s*rmax*a* v^abs(m-n);
                    % Überprüfen, ob im definierten Interval
                    if newVar<Wertebereiche{m, 1} %Min
                        newVar = Wertebereiche{m, 1};
                    elseif newVar>Wertebereiche{m, 2} %Max
                        newVar = Wertebereiche{m, 2};
                    end
                    mPopChilds.Individuen(k, m) = newVar;
                end
               
            end
        end
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.12.2017, 12:34     Titel:
  Antworten mit Zitat      
Hallo,

um stehen zu bleiben, sobald NaN entstehen:

Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thilo99
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2017, 16:12     Titel:
  Antworten mit Zitat      
Hallo,

ich habe den Fehler nun endlich gefunden, verstehe aber noch nicht warum er entsteht. Hier erst mal der Code:

Code:
% Input:
%   x           Weg
%   F           Kraft
%   P_1379      Auswertpunkte [x1 x3 x7 x9] bzw. [F1 F3 F7 F9]
%   AuswGroesse Auswertgröße 'x' oder 'F'
%   plot_flag
%
% Output:
%   c           Steifigkeit
%
% c = (c_13 + c_79)/2
%

%% Kontrolle
narginchk(4, 5);
if nargin == 4
    plot_flag = 0;
end

% Interpolieren
if numel(x)<500
    xq = (linspace(1, numel(x), 500))';
    x = interp1((1:numel(x))', x, xq);
    F = interp1((1:numel(F))', F, xq);  
end

%% Steifigkeit berechnen
switch AuswGroesse
    case 'x'
        Y1 = x;
        Y2 = F;
    case 'F'
        Y1 = F;
        Y2 = x;
end

s = zeros(numel(P_1379), 1);
Fs = zeros(numel(P_1379), 1);
for k = 1:numel(P_1379)
    Ampl_tmp = (max(Y1)-min(Y1))/2;
    [~,~,XMIN,IMIN] = extrema(abs(Y1-P_1379(k)));
    IMIN = IMIN(XMIN<0.015*Ampl_tmp);
   
    if k<=2
        [~,I] = min(Y2(IMIN));
    else
        [~,I] = max(Y2(IMIN));
    end

    s(k) = x(IMIN(I));
    Fs(k) = F(IMIN(I));
end

c_13 = (Fs(2)-Fs(1))/(s(2)-s(1));
c_79 = (Fs(3)-Fs(4))/(s(3)-s(4));

c = (c_13 + c_79)/2;
 


Ich bekomme durch meine Simulation ein richtiges Y1 (siehe Anhang)

Aus max(Y1) macht er mir jedoch: -6.1116
und aus min(Y1): 0.0016

dadurch bekomme ich eine negative Amplitude Ampl_tmp
IMIN wird zu: []
und der Fehler kommt dann bei: s(k) = x(IMIN(I));

Kann sich jmd erklären warum die max und min Funktion nicht die richtigen Werte nimmt?

Beste grüße
Thilo

Y1.PNG
 Beschreibung:

Download
 Dateiname:  Y1.PNG
 Dateigröße:  37.13 KB
 Heruntergeladen:  323 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.12.2017, 16:43     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich bekomme durch meine Simulation ein richtiges Y1 (siehe Anhang)

Was ist daran das Y1? Die x-Werte, die y-Werte, oder sind das Real- gegen Imaginärteile eines komplexen Y1?

Dass Standardfunktionen wie min und max Fehler enthalten, ist extrem unwahrscheinlich. Was zeigt
Code:

an?

In der Funktion scheint die erste Zeile zu fehlen. Ein reproduzierbares Beispiel, also ein MAT-File mit Inputs, wäre hilfreich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thilo99
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.12.2017, 17:05     Titel:
  Antworten mit Zitat      
Danke für die schnelle Rückmeldung!

hier der ganze Code:

Code:
function c = getsteifigkeit_VR(x, F, P_1379, AuswGroesse, plot_flag)
% steifigkeit_VR.m berechnet die Steifigkeit nach Versuchsrichtlinie
%  c = getsteifigkeit_VR(x, F, P_1379, AuswGroesse, plot_flag)
%
% Input:
%   x           Weg
%   F           Kraft
%   P_1379      Auswertpunkte [x1 x3 x7 x9] bzw. [F1 F3 F7 F9]
%   AuswGroesse Auswertgröße 'x' oder 'F'
%   plot_flag
%
% Output:
%   c           Steifigkeit
%
% c = (c_13 + c_79)/2
%

%% Kontrolle
narginchk(4, 5);
if nargin == 4
    plot_flag = 0;
end

% Interpolieren
if numel(x)<500
    xq = (linspace(1, numel(x), 500))';
    x = interp1((1:numel(x))', x, xq);
    F = interp1((1:numel(F))', F, xq);  
end

%% Steifigkeit berechnen
switch AuswGroesse
    case 'x'
        Y1 = x;
        Y2 = F;
    case 'F'
        Y1 = F;
        Y2 = x;
end

s = zeros(numel(P_1379), 1);
Fs = zeros(numel(P_1379), 1);
for k = 1:numel(P_1379)
    Ampl_tmp = (max(Y1)-min(Y1))/2;
    [~,~,XMIN,IMIN] = extrema(abs(Y1-P_1379(k)));
    IMIN = IMIN(XMIN<0.015*Ampl_tmp);
   
    if k<=2
        [~,I] = min(Y2(IMIN));
    else
        [~,I] = max(Y2(IMIN));
    end

    s(k) = x(IMIN(I));
    Fs(k) = F(IMIN(I));
end

c_13 = (Fs(2)-Fs(1))/(s(2)-s(1));
c_79 = (Fs(3)-Fs(4))/(s(3)-s(4));

c = (c_13 + c_79)/2;

%% Plotten
if plot_flag==1
    figure('name', 'Steifigkeitsbestimmung nach VR');
    box on,
    grid minor,
    hold all
    plot(x, F, 'LineWidth', 2);
    plot(s, P_1379, 'ko');
    plot([min(x) max(x)], interp1(s(1:2), P_1379(1:2), [min(x) max(x)], 'linear', 'extrap'), 'k-');
    plot([min(x) max(x)], interp1(s(3:4), P_1379(3:4), [min(x) max(x)], 'linear', 'extrap'), 'k-');
end
   


Code:
K>> which max
built-in (C:\Program Files\sc\Matlab\2017B\toolbox\matlab\datafun\max)
K>> which min
built-in (C:\Program Files\sc\Matlab\2017B\toolbox\matlab\datafun\min)


Die Y Achse sind die realen Anteile von Y1
X Achse ist x
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.12.2017, 17:11     Titel:
  Antworten mit Zitat      
Hallo,

d.h. Y1 hat auch imaginäre Anteile?

Poste doch bitte ein MAT-File mit Daten, die das Problem reproduzieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Thilo99
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 14.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.12.2017, 09:50     Titel:
  Antworten mit Zitat      
Hallo,

Ja Y1 (aus der Kraft F) hat in dieser Simulation auch imaginäre Anteile. In anderen allerdings nicht und dennoch kommt es, wenn auch deutlich später (nach Generationen) zum gleichen Fehler. Die Ampl_tmp muss auch nicht zwangsläufig negativ sein. IMIN kann trotzdem zu nem leeren Array werden.

In den Anhang habe ich die aktuellen Input Daten bis kurz vor dem Fehler reingepackt.

Danke!
Grüße
Thilo

Input_Data_2.mat
 Beschreibung:

Download
 Dateiname:  Input_Data_2.mat
 Dateigröße:  753.69 KB
 Heruntergeladen:  307 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.12.2017, 11:48     Titel:
  Antworten mit Zitat      
Hallo,

mit den Daten bekomme ich:
>> max(Y1)
ans =
-2.1031 + 0.0061852i
>> min(Y1)
ans =
0.00029738 + 0.00010281i

Die Frage ist: was macht max und min bei komplexen Zahlen? Augenscheinlich gibt es das Element mit dem höchsten bzw. niedrigsten Betrag zurück, was ja auch sinnvoll ist. Das heißt also, dass im Extremfall ein Maximum auch bei -6 liegen kann und ein Minimum bei 3:

v = [-6, 4+i, 3];
>> max(v)
ans =
-6
>> min(v)
ans =
3

Wie man hier am besten die Amplitude ermittelt (oder was Amplitude im Zusammenhang mit komplexen Zahlen überhaupt heißt), kann ich dir jetzt leider auch nicht sagen...

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 2024 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.