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

Probleme mit dem übertragen von Ergebnissen in eine Matrix

 

lenny87872

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.06.2015, 17:47     Titel: Probleme mit dem übertragen von Ergebnissen in eine Matrix
  Antworten mit Zitat      
Hallo Zusammen,

ich möchte direkt zu Erkennen geben, dass ich ein Matlab Anfänger bin und nicht so richtig weiß was sich tue. Daher bitte ich um Nachsicht falls ich ab und zu über eine nicht so schnelle Auffassungsgabe verfüge. :S

Also,

ich vermute ähnliche Fragen wurden hier bereits gestellt, es geht darum das ich die Ergebnisse 2er Rechnungen anhand des absoluten Fehlers vergleichen möchte. Im konkreten Fall geht es um die Berechnung eines Integrals.

Die Berechnung soll mit der Standardfunktion quad() verglichen werden. Um das ganze später als Grafik darstellen zu können möchte ich die Ergebnisse eine For-Schleife in eine Matrix schreiben.

Hier ist mein code:
Code:

% Teil 1, Eingaben für das Script
f = input ('Bitte geben Sie die Formel ein, zu der ein Interval berechnet wird, beginne mit "@" EXAMPLE:   @(x)((sin(3*x)/(x+1)))*(exp(cos(x).^2))  ')
disp ('Geben Sie die Intervallgrenzen ein')
a = input ('untere Grenze')
b = input ('obere Grenze')
disp ('Geben Sie die Anzahl der Stützstellen ein')
M_min = input ('Anzahl Minimum')
M_max = input ('Anzahl Maximum')

% Teil 2, Rechnung
Vgl=quad(@(x)((sin(3*x)/(x+1)))*(exp(cos(x).^2)),a,b);

x=[]; y=[];
for o=M_min:M_max
for n=M_min:M_max
        h = (b-a)/M_min; % Intervallbreite
        sum = 0; % Startwert = 0
        for k = 1:(M_min-1) %M_min mindestens 2 da hier sonst 0 steht
            x = a + h*k;
            sum = sum + feval(f,x);
        end
    sum = h/2*(feval(f,a) + feval(f,b)) + h*sum
    Fehler = Vgl-sum
    %string_fehler_trap=[M_min, Fehler];
    M_min = M_min+1;
end;
end;
x=[o];y=[Fehler(o)];
disp(x)
disp(y)
semilogy(x,y)
grid on
 


Es wäre super wenn ihr micht auf Fehler hinweist, aber bitte bedenkt das mir das Fachvokabular noch nicht so geläufig ist.


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.06.2015, 23:52     Titel: Re: Probleme mit dem übertragen von Ergebnissen in eine Mat
  Antworten mit Zitat      
Hallo lenny87872,

Was genau ist Deine Frage?

Statt eines Scripts und Eingaben per INPUT sind Funktionen mit Input-Argumenten.
Code:
% Teil 2, Rechnung
Vgl=quad(f,a,b);  % Du wolltest doch f per Input eingeben!

x=[];
y=[];  % Ein befehl pro Zeil ist besser

% Wozu dienen diese zwei Schleifen?
% Weder o not n werden innerhalb verwendet!

for o=M_min:M_max
for n=M_min:M_max

        h = (b-a)/M_min; % Intervallbreite

        % SUM ist ein wichtiger Matlab-Befehl. Wenn Du das als Variable
        % definierst gibt es häufig unerwartetes später:
        sum = 0; % Startwert = 0
       
        for k = 1:(M_min-1) %M_min mindestens 2 da hier sonst 0 steht
            x = a + h*k;
            sum = sum + feval(f,x);
        end

    sum = h/2*(feval(f,a) + feval(f,b)) + h*sum
    Fehler = Vgl-sum
    %string_fehler_trap=[M_min, Fehler];
    M_min = M_min+1;
end;
end;

% o ist außerhalb der FOR-Schleife nicht eindeutig definiert!
x=[o];
y=[Fehler(o)];  % Fehler ist kein Vektor
 

Ich vermute mal, dass Du Fehler nicht in jeder Iteration überschreiben möchtest, aber das ist nur wild geraten. Wenn Du Fehler als Vektor speichern möchtest, brauchst Du etwas wie: "Fehler(k) = Vgl - Summe" mit geeignetem "k".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.06.2015, 00:10     Titel:
  Antworten mit Zitat      
Hallo,

ja genau ich möchte "Fehler" nicht immer überschreiben, sondern eine Matrix erstellen, welche die Ergebnisse der Durchläufe Speichert.

Leider habe ich nicht genau verstanden was ich mit dem "K" machen soll.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.06.2015, 16:27     Titel:
  Antworten mit Zitat      
Hallo,

Dann probiere es doch einfach mal an einem kleinen Beispiel.

Eine sinnvolle Antwort kann ich erst geben, wenn ich verstehe. wozu die Schleifen über n und o überhaupt dienen sollen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
lenny87872

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2015, 20:15     Titel:
  Antworten mit Zitat      
Hallo noch einmal.

Ich habe versucht meinen code entsprechend zu ändern. Weiterhin habe ich das Problem das ich nicht wo wirklich verstehe was ich mache, aber ich glaube ich bin meinem Ziel einen Schritt Näher gekommen.

Die Schleifen waren da, weil ich im Internet gelesen hatte das mein Problem evtl so gelöst werden könnte. Dem ist/war nicht so.

Hier der geänderte Code:

Code:

clear
format long;

% Teil 1, Eingaben für das Script
f = input ('Bitte geben Sie die Formel ein, zu der ein Interval berechnet wird, beginne mit "@" EXAMPLE:   @(x)((sin(3*x)/(x+1)))*(exp(cos(x).^2))  ')
disp ('Geben Sie die Intervallgrenzen ein')
a = input ('untere Grenze')
b = input ('obere Grenze')
disp ('Geben Sie die Anzahl der Stützstellen ein')
M_min = input ('Anzahl Minimum')
M_max = input ('Anzahl Maximum')

% Teil 2, Rechnung
Vgl=quad(@(x)((sin(3*x)/(x+1)))*(exp(cos(x).^2)),a,b);
pointer = 1;

x=[];
for n=M_min:M_max
   
        h = (b-a)/M_min; % Intervallbreite
        sum = 0; % Startwert = 0
        for k = 1:(M_min-1); % M_min mindestens 2 da hier sonst 0 steht
            x = a + h*k;
            sum = sum + feval(f,x);
        end
    sum = h/2*(feval(f,a) + feval(f,b)) + h*sum;
    Fehler = Vgl-sum;
    x(pointer,1) = Fehler;
    M_min = M_min+1;
    pointer = pointer+1;
end;
 



Die Schleife ist da, um in der Rechnung die Anzahl der Stützstellen nach und nach zu erhöhen. Ich möchte herausfinden, wie sich der absolute Fehler einer Berechnung in Abhängigkeit zur Anzahl der Stützstellen verändert.
Die Berechnung des absoluten Fehlers (Fehler) funktioniert, die ergebnisse habe ich mir durch einfaches wegnehmen des Semikolons anzeigen lassen. Sieht alles richtig aus.

Nun möchte ich eine Matrix erstellen, in der diese Werte eingetragen werden.

Mein Problem momentan ist:
in der Matrix x wird nur in der letzten Zeile der korrekte Wert eingetragen. In der ersten Zeile wird ein eher hoher Wert eingetragen, der auch so nicht gezeigt wird wenn ich mir die einzelnen Ergebnisse von "Fehler" anzeigen lasse.

In den Zeilen 2 bis 99 wird immer eine 0 eingetragen. Warum?? Wieso trägt er nicht den Wert den "Fehler" in dieser Iteration hatte dort ein?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.06.2015, 21:37     Titel:
  Antworten mit Zitat      
Hallo lenny87872,

Statt der Inputs ist es viel einfacher die Angaben in ein File zu schreiben. Dann muss man es nur einmal eintippen, um die Rechnung noch mal zu wiederholen.

Du verwendest x zweimal, nämlich auch innerhalb der Schleife als Scalar. Dadurch überschreibst Du die Differenzen immer wieder.

Code:

% Teil 1, Eingaben für das Script
f = @(x)((sin(3*x)/(x+1)))*(exp(cos(x).^2));
a = 0; % untere Grenze
b = 10; % obere Grenze
M_min = 2; % Anzahl Minimum
M_max = 100;  % Anzahl Maximum

% Teil 2, Rechnung
Vgl = quad(f,a,b);

counter = 1;
Result = zeros(M_max - M_min + 1);  % Pre-allocation
for n = M_min:M_max
    h = (b-a) / n; % Intervallbreite, n statt M_min
    s = 0; % Nicht die Matlab-Funktion SUM überschreiben!
    for k = 1:(M_min-1) % M_min mindestens 2 da hier sonst 0 steht
        x = a + h*k;
        s = s + feval(f,x);
    end
    s = h/2*(feval(f,a) + feval(f,b)) + h*s;
   
    Result(counter,1) = Vgl - s;
    counter = counter +1;
end

Gruß, Jan
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.