Probleme mit dem übertragen von Ergebnissen in eine Matrix
lenny87872
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.06.2015, 17:47
Titel: Probleme mit dem übertragen von Ergebnissen in eine Matrix
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
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
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.06.2015, 00:10
Titel:
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.
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
lenny87872
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 14.06.2015, 20:15
Titel:
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.
% 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;
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?
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
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
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
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.