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

Rekursion in Matlab

 

DKKA
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 16.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2015, 22:57     Titel: Rekursion in Matlab
  Antworten mit Zitat      
Hallo,

Leider verwirrt mich dieses ohne "return variable" wie es in anderen Programmiersprachen üblich ist ein bisschen, darum weiss ich nicht, wo der Fehler in meiner Rekursion liegt. Ich möchte gerne eine Folge addieren und von 1 bis n hochzählen. Dann wenn ich 50 habe möchte ich noch a^n dazu addieren. Kann mir jemand weiterhelfen? Die Zeile mit dem nchoosek sollte stimmen.

Code:
function task_2_2
    n=50; a=4; b=3; r=1;  
    sol = rec(a,b,n,r);
    fprintf('%i \n', sol);
return

function sol = rec(a,b,n,r)
    if r<=n
        sol = nchoosek(n,r)*((-1)^r)*(b^r)*(a^(n-r));
        sol = sol+rec(a,b,n,r+1);
    else
        sol=a^n;
    end
return
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.497
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.02.2015, 23:05     Titel:
  Antworten mit Zitat      
Hallo,

woraus schließt du, dass es einen Fehler gibt?

Falls das Resultat nicht dem gewünschten entspricht: hast du es mal mit dem Debugger versucht?

Das "return" ist übrigens jeweils unnötig.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 16.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.02.2015, 23:09     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

woraus schließt du, dass es einen Fehler gibt?

Falls das Resultat nicht dem gewünschten entspricht: hast du es mal mit dem Debugger versucht?

Das "return" ist übrigens jeweils unnötig.

Grüße,
Harald


Hallo Harald,

Ich habe das ganze noch iterativ geschrieben und kriege nicht das selbe Ergebnis:
Code:

function task_2_1
    n=50; a=4; b=3;
    sol=a^n;
    for r=1:n
            sol = sol + nchoosek(n,r)*((-1)^r)*(b^r)*(a^(n-r));
    end
    fprintf('%i \n', sol);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.497
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.02.2015, 23:25     Titel:
  Antworten mit Zitat      
Hallo,

die Summanden erreichen Werte in der Größenordnung 1e41. Da die Rechenoperationen in einer unterschiedlichen Reihenfolge ausgeführt werden, kann eine Ungenauigkeit in der Größenordnung von 1e24 daher rühren.

Wenn du mit symbolischen Variablen rechnen lässt, kommt bei beiden Programmen 1 heraus. Sollte das so sein?

Code:
function task_2_1

    n=sym(50); a=sym(4); b=sym(3);
    sol=a^n;
    for r=sym(1:n)
            sol = sol + nchoosek(n,r)*((-1)^r)*(b^r)*(a^(n-r));
    end
    disp(sol)
  %  fprintf('%i \n', sol);


Code:
function task_2_2
   
n=sym(50); a=sym(4); b=sym(3); r=sym(1);  
    sol = rec(a,b,n,r);
        disp(sol)

  %  fprintf('%i \n', sol);


function sol = rec(a,b,n,r)
    if r<=n
        sol = nchoosek(n,r)*((-1)^r)*(b^r)*(a^(n-r));
        sol = sol+rec(a,b,n,r+sym(1));
    else
        sol=a^n;
    end


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 16.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2015, 00:32     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

die Summanden erreichen Werte in der Größenordnung 1e41. Da die Rechenoperationen in einer unterschiedlichen Reihenfolge ausgeführt werden, kann eine Ungenauigkeit in der Größenordnung von 1e24 daher rühren.

Wenn du mit symbolischen Variablen rechnen lässt, kommt bei beiden Programmen 1 heraus. Sollte das so sein?

Code:
function task_2_1

    n=sym(50); a=sym(4); b=sym(3);
    sol=a^n;
    for r=sym(1:n)
            sol = sol + nchoosek(n,r)*((-1)^r)*(b^r)*(a^(n-r));
    end
    disp(sol)
  %  fprintf('%i \n', sol);


Code:
function task_2_2
   
n=sym(50); a=sym(4); b=sym(3); r=sym(1);  
    sol = rec(a,b,n,r);
        disp(sol)

  %  fprintf('%i \n', sol);


function sol = rec(a,b,n,r)
    if r<=n
        sol = nchoosek(n,r)*((-1)^r)*(b^r)*(a^(n-r));
        sol = sol+rec(a,b,n,r+sym(1));
    else
        sol=a^n;
    end


Grüße,
Harald


Hallo Harald,

ja das könnte sehr gut möglich sein, da ich dass für Numerik programmiere. Diese symbolischen Variablen sind nicht teil des Standard-Matlab Package?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.497
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.02.2015, 09:56     Titel:
  Antworten mit Zitat      
Hallo,

nein, symbolische Variablen kommen aus der Symbolic Math Toolbox.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 23.02.2015, 10:25     Titel:
  Antworten mit Zitat      
Zitat:
ja das könnte sehr gut möglich sein, da ich dass für Numerik programmiere.


Könnte also genau das sein was das Lernziel ist - verstehen warum (wie Harald beschrieben hat) andere Rechenreihenfolgen andere Ergebnisse ergeben können.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
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.