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

Dynamische Programmierung verschachtelter Maximumfunktion

 

Isimath

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2021, 12:37     Titel: Dynamische Programmierung verschachtelter Maximumfunktion
  Antworten mit Zitat      
Hallo,
ich bin leider ein totaler Neuling was Programmieren angeht.
Ich möchte gern bis zu einem Horizont T>n rekursiv

F(n,x)=max{x/n,(F(n+1,x+1)+F(n+1,x-1))/2)}

berechnen, wobei n>=0 und x eine ganze Zahl bezeichnet und F gegben ist durch

F(T,x)=x/T falls x >= a*T^(1/2)
F(T,x)=f(T,x) falls x< a*T^(1/2)

wobei a eine Konstante und f eine stetige Funktion beschreibt.

Leider gelingt mir die Implemntierung nicht.
Kann mir jemand helfen wie ich diese Rekursion implementiere?

Vielen Dank


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.04.2021, 14:00     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Leider gelingt mir die Implemntierung nicht.

Poste bitte das, was du versucht hast, und beschreibe genau die konkreten Probleme, auf die du gestoßen bist.
Wenn du nicht weißt, wie du anfangen sollst, empfehle ich das MATLAB Onramp.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2021, 14:48     Titel:
  Antworten mit Zitat      
Code:

function [rekursO] = rekursion(n,x)
t=10;
if n<t
    rekursO=max(x/n,(rekursion(n+1,x+1)+rekursion(n+1,x-1)));
elseif n==t
    rekursO=max(x/(n-1),funktion(n-1,x));
   
end
 
 
Harald
Forum-Meister

Forum-Meister


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

und was ist funktion? Zudem:
Zitat:
beschreibe genau die konkreten Probleme, auf die du gestoßen bist.


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2021, 15:14     Titel:
  Antworten mit Zitat      
Code:

function [rekursO] = rekursion(n,x)
t=10;  
if n<t
    rekursO=max(x/n,(rekursion(n+1,x+1)+rekursion(n+1,x-1))/2);
elseif n==t
    rekursO=max(x/(n-1),funktion(n-1,x));
   
end
 


Das Problem ist, dass ich hier den Wert (0,0) nicht berechnen kann.

Code:

funktion(n-1,x));
 

ist eine Methode, in der ich eine stetige Funktion f(n,x) auswerte. Die genaue Definition dieser Funktion würde den Umfang dieser Frage sprengen und hat auch für die Rekursion (hoffentlich) keine Bedeutung
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2021, 15:17     Titel:
  Antworten mit Zitat      
genauer gesagt, ist
Code:

funktion(n-1,x)
 

die entsprechende Funktion F(T-1,x) oben aus der Fragestellung
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2021, 15:22     Titel:
  Antworten mit Zitat      
Außerdem ist mein Problem, dass diese Rekursion nur für kleine Horizonte t funktioniert.
Gibt es einen Weg dies zu optimieren?
 
Harald
Forum-Meister

Forum-Meister


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

wenn ich z.B. funktion(n-1, x) durch (n-1)*x ersetze, scheint alles zu klappen, z.B. rekursion(5,5).

Zitat:
Das Problem ist, dass ich hier den Wert (0,0) nicht berechnen kann.
funktion(n-1,x)

Wie rufst du rekursion auf und was ist die Fehlermeldung? Für mich liegt nahe, dass das Problem in funktion liegt.

Zitat:
die entsprechende Funktion F(T-1,x) oben aus der Fragestellung

das verschiebt die Frage dann auf f

Zitat:
Die genaue Definition dieser Funktion würde den Umfang dieser Frage sprengen und hat auch für die Rekursion (hoffentlich) keine Bedeutung

Ich fürchte schon, dass es eine Bedeutung hat. Wenn es keine oder nur eine eingeschränkte Bedeutung hat, kannst du gerne eine mehr oder weniger stark vereinfachte Funktion angeben. Sie nicht zur Verfügung zu stellen erschwert es aber sehr, dir zu helfen.

Zitat:
Außerdem ist mein Problem, dass diese Rekursion nur für kleine Horizonte t funktioniert.

Was heißt "klein", und wie äußert sich das Nicht-Funktionieren?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2021, 15:50     Titel:
  Antworten mit Zitat      
Das Problem bzgl. der (0,0) ist, dass hier durch 0 geteilt wird bei
Code:

if n<t
    rekursO=max([b]x/n[/b],(rekursion(n+1,x+1)+rekursion(n+1,x-1))/2);
 


Das Problem für große t tritt bereits bei einem Horizont von t=1000 auf. Matlab rechnet bspw. für t=1000 bzgl. dem Punkt (220,12) ewig lange.

Die ''funktion'' habe ich wie folgt implementiert
Code:

function[werte]=funktion(t,x)
a=alpha();
bed=a*sqrt(t+1);
wert1=0;
wert2=0;
if x+1>bed
    wert1=(x+1)/(t+1);    
else
    wert1=wertefunktion(t+1,x+1);
end
if x-1>bed
    wert2=(x-1)/(t+1);
else
    wert2=wertefunktion(t+1,x-1);  
end
werte=1/2*(wert1+wert2);
 

wobei
Code:

function[hcfunktion]=wertefunktion(t,x)
c=0.49
hcfunktion=sqrt(pi./(4.*c.*t)).*exp(x.^2./(4.*c.*t));
 
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Das Problem bzgl. der (0,0) ist, dass hier durch 0 geteilt wird

Und was soll in dem Fall das Ergebnis sein? Wie wäre eine zusätzliche Fallunterscheidung?

Zitat:
Matlab rechnet bspw. für t=1000 bzgl. dem Punkt (220,12) ewig lange.

Wenn ich das richtig sehe, wären das 2^780 oder ungefähr 6e234 Funktionsaufrufe. Das schafft kein Rechner der Welt in keiner Programmiersprache der Welt.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2021, 20:11     Titel:
  Antworten mit Zitat      
Leider weiß ich nicht wie eine derartige Fallunterscheidung aussehen soll.

Gibt es eine Möglichkeit die rekursion besser zu machen, sodass man die Methode für größere t berechnen kann?
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Leider weiß ich nicht wie eine derartige Fallunterscheidung aussehen soll.

Du hast doch schon if-Anweisungen in deinem Code?
Code:
if n == 0
    % Sonderfall
else
    % bisheriger Ansatz
end


Zitat:
Gibt es eine Möglichkeit die rekursion besser zu machen, sodass man die Methode für größere t berechnen kann?

Ideal wäre natürlich, wenn du ohne eine Rekursion auskommen kannst. Ich wüsste aber nicht wie.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2021, 12:17     Titel:
  Antworten mit Zitat      
Wie könnte ich denn die Rekursion, iterativ mit einer for-schleife ausdrücken?
 
Harald
Forum-Meister

Forum-Meister


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

ich zumindest wüsste (wie gesagt) nicht wie.
Dass sich noch jemand anders in die Unterhaltung einklinkt, ist eher unwahrscheinlich.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.