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

Iterationsschleife trifft Grenzbereich nicht

 

corleone13375
Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 18.09.15
Wohnort: Aachen
Version: R2015b
     Beitrag Verfasst am: 02.05.2017, 16:52     Titel: Iterationsschleife trifft Grenzbereich nicht
  Antworten mit Zitat      
Hallo,
ich habe ein (vielleicht eher mathematisches) Problem bei dem ich nicht weiter komme.
Für eine Approximation habe ich eine Gleichung welche von den Parametern k_1 und k_2 abhängig ist (Potenzregression). Ich möchte nun über eine Iterationsschleife die Faktoren k_1 und k_2 bestimmen.
Dabei habe ich versehentlich zuerst eine fehlerhafte Gleichung eingebaut, mit der die Iteration funktioniert.

Code:
% Approximationsfaktoren k1 und k2 für Potenzregression bestimmen
 
% benötigte Parameter
D_g_a = 240;
D_ar = 220;
D_wk = 35;
d=110;
delta_i = 2.394;
e_strich = 210000;
l_eff_i_n_I = 30;
d_m = 0.5 *(D_g_a-d);
t = (D_g_a - D_ar)/2;
genauigkeit = 0.1;
q_max_i=100;
obere_iterationsgrenze = 1 + genauigkeit/1000;
untere_iterationsgrenze = 1 - genauigkeit/1000;
 
% Iterative Berechnung der Faktoren k_1 und k_2 über Kräftegleichgewicht  
x = ( q_max_i ) / ( pi * e_strich * l_eff_i_n_I * d_m ); % Berechne  x
y = 2 * x * log ( exp(-1) / x); % Berechne y
   
% Anfangsbedingungen für Iteration
quot_summe_q_t = 1.2; % Setze Summe q_t
k_2 = 1; % Setze k2
 
%% Starte Schleife zur Berechnung von k_1
while quot_summe_q_t > obere_iterationsgrenze  || quot_summe_q_t < untere_iterationsgrenze
 % Ändere k_2
  if quot_summe_q_t > 1.1
     k_2 = 0.99 * k_2;
  else
     k_2 = 1.01 * k_2;
  end
 % Berechne k_1
  k_1 = x / (y^k_2);
 %Berechne q_max_i_iteriert
  q_max_i_iteriert = k_1 * (((pi*e_strich*l_eff_i_n_I*t)/(1+D_wk/d_m)) * (delta_i*(1+D_wk/d_m)) / t )^k_2;
 %Berechne quot_summe_q
  quot_summe_q_t = q_max_i_iteriert / q_max_i;
end
 


Die Gleichung für q_max_i_iteriert hat jedoch Klammern an den falschen Stellen. Die korrekte Gleichung muss lauten:

Code:
q_max_i_iteriert = k_1 * ((pi*e_strich*l_eff_i_n_I*t)/(1+D_wk/d_m)) * (delta_i*(1+D_wk/d_m) / t )^k_2;


Wenn ich die Gleichung in dem Code berichtige, dann funktioniert jedoch meine Iteration nicht mehr. Mit der falschen Gleichung wurde das Ergebnis sofort angezeigt und mit der korrigierten Gleichung ist Matlab „Busy“, also rechnet die ganze Zeit.

Ich habe mir nun schon soweit Gedanken gemacht, dass wohl der Bereich zwischen den Iterationsgrenzen (untere_Iterationsgrenze und obere_Iterationsgrenze) nicht getroffen werden und die while-Schleife dabei bei einem n-ten Durchlauf von oberhalb der oberen Iterationsgrenze nach unterhalb der unteren Iterationsgrenze springt und somit nicht aus der Schleife raus kommt.

Wenn ich die Iterationsgrenzen vergrößere, dann funktioniert die Iteration wieder. Allerdings ist mir dann das Ergebnis zu ungenau. Die Idee war ja, dass die Abweichung quot_summe_q_t=q_max_iteriert / q_max_i nur +-Ein-Tausendstel beträgt.

Meine nächste Idee war es die Faktoren 0.99 bzw. 1.01 mit denen k_2 iterativ angepasst wird zu verfeinern. Bei einer Änderung auf 0.9999 bzw. 1.0001 funktioniert die Iteration auch nicht. Mehr Nachkommastellen kann ich ja nicht verwenden, oder?

Ich habe keine vpa-Toolbox für symbolisches rechnen.

Hat jemand eine Idee wie ich das Problem lösen kann oder zumindestens eine Einschätzung ob ich bei der Fehlersuche auf dem richtigen Weg bin?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.05.2017, 22:51     Titel:
  Antworten mit Zitat      
Hallo,

schau dir doch mal im Debugger an, wie sich die Variablen entwickeln.

Wenn ich das richtig verstehe, willst du letztlich eine Gleichung lösen? Dafür würde sich fsolve oder fzero anbieten.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 18.09.15
Wohnort: Aachen
Version: R2015b
     Beitrag Verfasst am: 03.05.2017, 10:35     Titel:
  Antworten mit Zitat      
Ich hab mir die Entwicklung von quot_summe_q_t mit dem Debugger mal angeschaut und denke, dass der Bereich zwischen den Abbruchbedingungen (untere und obere Iterationsgrenze) der Schleife tatsächlich nicht getroffen wird, da die Änderungen zu grob sind.

Ja, ich möchte die Gleichung x=k_1*y^k_2 bei bekanntem x und y lösen, also die Werte für k_1 und k_2 bestimmen.

fsolve kann ich nicht verwenden, da ich keine Optimization Toolbox habe.

fzero könnte ich verwenden, aber ich habe bisher nur Gleichungen mit einer Unbekannten damit gelöst. Ist das auch für mehrere möglich?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

da du k_1 in Abhängigkeit von k_2 bestimmst, kann man es so sehen, dass du eigentlich nur k_2 variierst (und k_1 eben entsprechend mit).

Alternativ kannst du fminsearch verwenden und die Abweichung minimieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 18.09.15
Wohnort: Aachen
Version: R2015b
     Beitrag Verfasst am: 03.05.2017, 15:19     Titel:
  Antworten mit Zitat      
Ich habe es mal mit fminsearch probiert, aber die Werte erscheinen mir nicht so plausibel. Außerdem sind sie ja stark von den gewählten Startwerten abhängig.

Code:
% benötigte Parameter
D_g_a = 240;
d=110;
e_strich = 210000;
l_eff_i_n_I = 30;
d_m = 0.5 *(D_g_a+d);
q_max_i=100;

% Iterative Berechnung der Faktoren k_1 und k_2 über Kräftegleichgewicht  
x = ( q_max_i ) / ( pi * e_strich * l_eff_i_n_I * d_m ); % Berechne  x
y = 2 * x * log ( exp(-1) / x); % Berechne y

% f(x):
 % k_1 = x/(y^k_2)
 % 0=-k_1+x/(y^k_2)

fun = @(k)-k(1)+x/y^k(2);
k0 = [2,2];
x = fminsearch(fun,k0)
 

Es führt zu der Ausgabe:
Code:
>> fminsearchTest
 
Exiting: Maximum number of function evaluations has been exceeded
         - increase MaxFunEvals option.
         Current function value: -204651058028379870000000000000000000000000000.000000


x =

   1.0e+44 *

    2.0465   -2.4274
 


Hab ich fminsearch denn richtig implementiert?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.05.2017, 15:24     Titel:
  Antworten mit Zitat      
Hallo,

Achtung: fminsearch löst keine Gleichung, sondern es minimiert. Wenn du also a = b erreichen möchtest, dann müsstest du (a-b).^2 minimieren.

Davon abgesehen steige ich nicht ganz durch, was hier gemacht werden soll. Die Lösung der Gleichung ist ja offensichtlich: wähle k_1 als x/(y^k_2).
Da muss es dann doch noch andere Einschränkungen geben? Z.B. dass x und y jeweils Vektoren sind und k_1 und k_2 so gewählt werden sollen, dass es insgesamt möglichst gut passt?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 25
Anmeldedatum: 18.09.15
Wohnort: Aachen
Version: R2015b
     Beitrag Verfasst am: 03.05.2017, 16:56     Titel:
  Antworten mit Zitat      
Du meinst so:
Code:
fun = @(k)(x/(y^k(2))-k(1)).^2;
k0 = [1,1];
x = fminsearch(fun,k0)

?
Die Werte erscheinen nun schon realistischer
Code:
x =

    0.7660    1.2322

Allerdings sind sie immer noch stark von den Startwerten abhängig.



Aus
Code:
y = 2 * x * log ( exp(-1) / x)

sollen einmal Wertepaare erzeugt werden, welche die Basis für die Approximation bilden. Die Werte entstehen dabei durch dei Wahl eines Wertebereiches von Null bis q_max_i.
Ich dachte aber dass man die Faktoren erstmal für einen Wert bestimmen kann.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Allerdings sind sie immer noch stark von den Startwerten abhängig.

Das ist kein Wunder, weil jede Kombination von k1 und k2 eine Lösung ist, falls
k_1 = x/(y^k_2). Anders gesagt, für jedes k2 gibt es ein k1, so dass die Gleichung gelöst wird.

Zitat:
Ich dachte aber dass man die Faktoren erstmal für einen Wert bestimmen kann.

Das halte ich aus o.g. Gründen nicht für sinnvoll.

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 - 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.