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

Funktionsgröße und Variablenzahl dynamisch regulieren

 

StarkEffect
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 24.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.05.2013, 23:38     Titel: Funktionsgröße und Variablenzahl dynamisch regulieren
  Antworten mit Zitat      
Hi,

versuche gerade eine Routine von mir zu verallgemeinern bei er eine bestimmte Zahl von Gleichungen mit fsolve gelöst wird. Ein einfaches Beispiel ist

Code:
optimFun=@(T)[harmonicOscilator(data,Numb,T(1),0)-c(1)-(T(1)+T(2)+T(3))-c(2)-c(3)-c(4);
      fun(T(2))-fun(T(1))+c(2)+T(1);
      fun(T(3))-fun(T(2)),0)+c(3)+T(2)];

options=optimset('Display','iter');
[T,fval] = fsolve(optimFun,T0,options);


wobei c's Konstanten sind die aus anderen Unterprogrammen gewonnen werden und fun(T) eine andere Funktion ist die von T abhängt. Soweit funktoniert alles, allerdings kann sich die Größe des Gleichungssystems und die Variablen, in dem Problem das ich behandle, öfter ändern. Beispielsweise könnte auch

Code:
optimFun=@(T)[harmonicOscilator(data,Numb,T(1),0)-c(1)-(T(1)+T(2)+T(3)+T(4))-c(2)-c(3)-c(4)-c(5);
      fun(T(2))-fun(T(1))+c(2)+T(1);
      fun(T(3))-fun(T(2)),0)+c(3)+T(2);
      fun(T(4))-fun(T(3)),0)+c(4)+T(3)];


als Funktion benötigt werden. Nun möchte ich vermeiden für jede Änderung der Größe des Gleichungssystems alle Eingaben per Hand zu verändern. Ist es daher möglich die Funktionen und Variablen irgendwie dynamisch zu variieren. Hatte mich meinen bisherigen Versuchen and dem Foreneintrag

http://www.gomatlab.de/funktion-in-.....ife-defnieren-t12531.html

gehalten. Allerdings konnte ich auch das dort angegebene Programm nicht zum Laufen bringen, da immer die Fehlermeldung Variable 'x' nicht definiert auftauchte.

Würde mich über eine Antwort und Lösung des Problems sehr freuen.

Viele Grüße

Sven
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 25.05.2013, 00:49     Titel:
  Antworten mit Zitat      
vielleicht mit
Code:

allerdings ist das schwer zu debuggen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

aus den zwei Funktionen kann man ein gewisses Muster vermuten. Wenn es ein solches Muster gibt, könnte man das über Funktionen wie sum und diff lösen.
Allerdings müsstest du zunächst mal sagen, ob es ein solches Muster gibt und wie es genau aussieht.
Das wäre vermutlich in einer separaten Funktion einfacher als in einem anonymous Function Handle.

Sind an manchen Stellen ein paar ",0" zuviel?

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

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 24.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2013, 18:26     Titel:
  Antworten mit Zitat      
Hi zusammen,

ja genau es gibt ein Muster wie du vermutest. Die erste Zeile ist ein Energieerhaltungssatz und enthält immer alle Variablen T(i) die in den folgenden Gleichungen vorkommen. Die folgenden Gleichungen sind alle identisch abgesehen davon, dass die Variablen sich ändern. Also in der ersten Gleichung kommt T(2) und T(1) vor, in der zweiten T(3) und T(2) usw. Die Funktion fun selbst sieht wie folgt aus:

Code:
function F=fun(T)
for i=1:size(data,2)
F=F+data(i)/2+data(i)/(exp(data(i)/T)-1)
end


Dabei ist die Größe data in der Funktion fun enthalten (wird vorher geladen und ändert sich die ganze Zeit während der Berechnung nicht mehr). Auch das ,0 zu viel ist stimmt sollte nur fun(T) sein.

Also wie von dir vermutet gibt es ein Muster, allerdings weiß ich nicht, ob man sum und diff in der Definition von Funktionen verwenden darf. Schaue mir das aber nochmal an.
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2013, 11:02     Titel:
  Antworten mit Zitat      
Hallo StarkEffect,

wenn Du eine richtige Funktion benutzen würdest, könntest Du das Ergebnis von fun auch zwischenspeichern und müsstest nicht alles doppelt berechnen.
Wenn dann noch fun Vektoren als Eingabe versteht:
Code:
funT = fun(T);
result=[harmonicOscilator(data,Numb,T(1),0)-sum(T)-sum(c);
  funT(2:end)-funT(1:end-1) + c(2:end) + T(1:end-1)];

function F=fun(T)
h = 0.5*sum(data);
F = zeros(size(T));
for i=1:numel(T)
    F(i) = h + sum(data./(exp(data/T(i))-1);
end
 
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.