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

Romberg Quadratur

 

Rego

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2011, 22:28     Titel: Romberg Quadratur
  Antworten mit Zitat      
Hallo, ich bin gerade dabei ein Programm für die Romberg Quadratur zu schreiben und habe mehrere Probleme.

Das Programm ist noch nicht fertig, deswegen seid bitte nicht so kritisch mit mir.

Ich weis es gibt in diesem Forum ein paar Programme zu diesem Thema, ich will aber mein eigenes Programm schreiben damit ich es auch verstehe was da gemacht wird.

Eigentlich soll das Programm das ich bis jetzt geschrieben habe nur die Werte für die Spalte 1 ausgeben und diese werden nach der Trapezregel berechnet.
Für Reihe 1:
T(i) = (b-a)/2 * (f(a) + f(b))

für alle anderen Reihen:
T(i) = (0.5 *(f(a) + f(b)) + sum(f(a+j*h))) * h;
bedeutet die hälfte des ersten und des letzten Funktionsstelle + Summe aller Funktionsstellen dazwischen multipliziert mit der Schrittweite h
h = (a-b)/(2^(i-1)-1)

wobei j so defeniert wird
j = 2^(i-1)-1;

Mein erstes Problem ist die Werte stimmen einfach nicht und das Nächste ist die weiteren Berechnungen werden nicht in die Reihen sondern in die Spalten eingetragen.
Code:
% Romberg Quadratur
syms x
f = inline (1/x);         %Funktion
a = 2;                      %Untere Integrationsgrenze
b = 4;                      %Obere Integrationsgrenze
n = 4;                      %Maximale Anzahl der Schritte (Abbruchkriterium)
eps = 1.0e-5;            %Genauhigkeit (Abbruchkriterium Nr.2)
T = zeros (n*n);        %Schafen des Rombergschemas
h = (b-a)/2^(i-1);      %Schrittweite


for i=1:n
    j = 2^(i-1)-1;
   
    if i == 1
        T(i) = (b-a)/2 * (f(a) + f(b));
       
    else
        T(i) = (0.5 *(f(a) + f(b)) + sum(f(a+j*h))) * h;
       
    end
   

fprintf('\ni =% 1.0f' , i);
for k=1:i
    fprintf('% 10.8f', T(k));
end
if i >= n                     %Abbruchkriterium Anzahl der Schritte
    return
else
    if i>=2
    if (T(i)-T(i-1)) < eps      %Abbruchkriterium Genauigkeit
    end
    end
end
   
end


Wenn ich für j und h in der Zeile 18 die richtigen Werte eingebe also 1 bekomme ich das richtige Ergebnis von 0,708333333
Kann mir bitte einer sagen wo der Fehler liegt?


Harald
Forum-Meister

Forum-Meister


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

bei Matrizen sollte immer Zeilen-Spalten-Indizierung verwendet werden.
T(i, j) spricht das Element in der i-ten Zeile und j-ten Spalte an.

Das dürfte schon mal einige Probleme lösen.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2011, 23:50     Titel:
  Antworten mit Zitat      
Danke schön ich werde es gleich ausprobieren.
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2011, 23:34     Titel:
  Antworten mit Zitat      
Hi ich habe mein Programm jetzt ein bischen umgeschrieben habe aber immer noch ein problem. In der ersten for Schleife habe ich ein sum einprogramiert, das Problem ist, das ich eine Fehlermeldung bekomme. Wenn ich sum entferne wird das Programm ausgeführt.
Wo könnte denn das Problem den liegen?

Code:

syms x
f = inline (1/x);           %Funktion
a = 2;                      %Untere Integrationsgrenze
b = 4;                      %Obere Integrationsgrenze
n = 6;                      %Maximale Anzahl der Schritte (Abbruchkriterium)
eps = 1.0e-5;               %Genauhigkeit (Abbruchkriterium Nr.2)
T = zeros(n*n);             %Schafen des Rombergschemas



for i=1:n
 
    if i == 1
        T(i) = (b-a)/2 * (f(a) + f(b));
       
    else
        h = (b-a)/2^(i-1);
        T(i)=0.5 * T(i-1) + h * sum(f(a +(2*(i-1)-1) * h));
    end
   
   
% Berechnung nach Romberg  
 for k=2:i                                    
        T(i,k) = (4^(k-1) * T(i,k-1) - T(i-1,k-1))/(4^(k-1)-1);   % Rekursionsformel
                                   
                                         
 end

fprintf('\ni =% 1.0f' , i);
for k=1:i
    fprintf('% 10.8f', T(i, k));
end
if i >= n                     %Abbruchkriterium Anzahl der Schritte
    return
else
    if i>=2
    if abs(T(i,k) - T(i-1,k)) < eps    %Abbruchkriterium Genauigkeit
        return
    end
    end
end

end
 
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.01.2011, 04:39     Titel:
  Antworten mit Zitat      
Hallo Anonymous,

Zitat:
In der ersten for Schleife habe ich ein sum einprogramiert, das Problem ist, das ich eine Fehlermeldung bekomme.

Da die Fehlermeldungen von Matlab fast ausnahmslos hilfreich sind, wäre es gut, wenn Du sie auch posten würdest.

Gruß, Jan
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: 26.01.2011, 12:03     Titel:
  Antworten mit Zitat      
Hallo,

einen Vorschlag schon mal:
Ersetze T = zeros(n*n); durch T = zeros(n,n);

Bei mir läuft der von dir gepostete Code durch, die Fehlermeldung wäre also wirklich wichtig.

Weiterer Vorschlag wären wie gesagt function handles statt inline.

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
 
rego

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.01.2011, 21:54     Titel:
  Antworten mit Zitat      
ich habe mich mit meinem Prof. unterhalten und er meinte es liegt daran das ich eine laufende variable in meinem sum verwende. ich bin gerade dabei es irgendwie hinzubekommen mein sum anders zu programmieren.

Es ist der folgende Fehler:
Error in ==> Romb at 19
T(i)=0.5 * T(i-1) + h * sum(f(a +(2*(i-1)-1) * h));

Vielen Dank für die rasche Antwort

MfG Rego
 
Harald
Forum-Meister

Forum-Meister


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

ich gehe nahezu jede Wette ein, dass das nicht das einzige ist, was da rot im Command Window steht. Was du postest, ist, in welcher Zeile die Fehlermeldung auftritt. Was aber mindestens ebenso relevant ist, ist die tatsächliche Fehlermeldung.

Insbesondere, weil dein Code bei mir fehlerfrei durchläuft. Aber das sagte ich schon, oder?

Und: was heißt "irgendwie anders"?

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
 
rego

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.01.2011, 23:18     Titel:
  Antworten mit Zitat      
Hi du sagst das mein Code bei dir gelaufen ist, ich habe so wie du es mir vorgeschlagen hast den zeros auf (n,n) geändert und trotzdem hatte ich eine Fehlermeldung.
Durch die neuberechnung der Stützstellen und Stützwerte habe ich hinbekommen das ich richtige Ergebnisse bekomme. Den Tip habe ich von meinem Prof. in der Vorlesung bekommen.
Ich habe jetzt meinen Code geändert und der schaut jetzt so aus:
Code:
syms x
f = inline (1/x);           %Funktion
a = 2;                      %Untere Integrationsgrenze
b = 4;                      %Obere Integrationsgrenze
n = 6;                      %Maximale Anzahl der Schritte (Abbruchkriterium)
eps = 1.0e-1;               %Genauhigkeit (Abbruchkriterium Nr.2)
T = zeros(n,n);             %Schafen des Rombergschemas



for i=1:n
 
    if i == 1
        T(i) = (b-a)/2 * (f(a) + f(b));     %Berechnung des ersten Wertes
       
    else
        S = 2^(i-2);                        %Laufvariable für die sum Berechnung
        h = (b-a)/2^(i-1);                  %Schrittweite
        c = a + h;                          %Neue Stützstellen
        sum = f(c);                         %Neue Stützwerteswerte
       
        for j = 2:S
            c = c + 2 * h ;                 %Ergenzende Stützstellen
            sum = sum + f(c);               %Ergenzende Stützwerte
        end
       
        T(i)=0.5 * T(i-1) + h * sum;        %Trapezregel mit der Summe aller stützstellen
    end
     
   
% Berechnung nach Romberg  
 for k=2:i                                    
        T(i,k) = (4^(k-1) * T(i,k-1) - T(i-1,k-1))/(4^(k-1)-1);   % Rekursionsformel                                    
 end

fprintf('\ni =% 1.0f' , i);                 %Drucken der i Spalte
for k=1:i
    fprintf('% 10.8f', T(i, k));            %Drucken der restlichen Spalten
end
for k = 2:i
if i >= n                                   %Abbruchkriterium Anzahl der Schritte
    return
else
    if i>=n
       
    if abs(T(i,k-1) - T(i-1,k-1)) < eps         %Abbruchkriterium Genauigkeit
        return
    end
       
    end
end    
end
end
 


Habe aber gerade gemerkt das mein Abbruchkriterium nicht funktioniert. Dieses geht nur für die erste Spalte. Werde noch gucken ob ich da was machen kann. Es fällt mir aber gerade nichts ein, wenn du einen Tip hast, wäre ich sehr dankbar.

MfG
Rego[/code]
 
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.