Verfasst am: 11.07.2010, 13:38
Titel: Approximation via Interpolation von Messdaten
Hallo,
ich habe ein Problem mit der im Anhang befindlichen "aufgabe.png".
Aufgabe a) ist kein problem.. einfach auf die messdaten zugreifen und plotten lassen
t musste gewählt werden, da das matlab auf dem uni-rechnerpool mir andernfalls bei polyfit fehler ausgab. (x-werte zu groß)
meine frage ist nun,
1)
wie kann ich den graph der messdaten mit einer quadratischen und linearen funktion approximieren (sodass die graphen in einem gemeinsamen plott auch auf der selben höhe (also zum teil die gleichen punkte) durchlaufen)
2)
wie kann ich mehere graphen gleichzeitig plotten lassen? (bei gnuplot ists ja einfach "plot x, y, f(x), ..." einfach mit "," getrennt funktioniert hier aber leider nicht :/ )
3.)
für aufgabe c) muss ich beide funktionen auch als funktionen angeben, sodass eine eingabe via p(2030) bzw. q(2030) auch den dazugehörigen zeitwert angeben (also eine relative prognose erstellen)
4.)
für aufgabe d) lässt sich doch via roots(p) bzw. roots(q) die "nullstellen" der approximationen angeben.. oder gibt es da einen eleganteren und besseren befehl um das ziel dieser aufgabe gekonnt zu bewältigen?
liebe Grüße und vielen Dank schonmal im Voraus!
Shalec
ps:
seh grad, das die .dat datei nicht hochgeladen werden kann, daher hier der inhalt:
Verfasst am: 11.07.2010, 17:40
Titel: Re: Approximation via Interpolation von Messdaten
Hallo Shalec,
shalec hat Folgendes geschrieben:
t musste gewählt werden, da das matlab auf dem uni-rechnerpool mir andernfalls bei polyfit fehler ausgab. (x-werte zu groß)
Das ist eine mir unbekannte Fehlermeldung. Meinst Du die Warnung "Polynomial is badly conditioned"?
Skalieren oder Zentrieren ist dann der Weg der Lösung.
shalec hat Folgendes geschrieben:
1) wie kann ich den graph der messdaten mit einer quadratischen und linearen funktion approximieren (sodass die graphen in einem gemeinsamen plott auch auf der selben höhe (also zum teil die gleichen punkte) durchlaufen)
Du hast die X-Werte skaliert um die Polynom-Interpolation besser zu konditionieren. Danach mußt Du einfach wieder zurück-skalieren.
shalec hat Folgendes geschrieben:
2) wie kann ich mehere graphen gleichzeitig plotten lassen?
help hold
shalec hat Folgendes geschrieben:
3.) für aufgabe c) muss ich beide funktionen auch als funktionen angeben, sodass eine eingabe via p(2030) bzw. q(2030) auch den dazugehörigen zeitwert angeben (also eine relative prognose erstellen)
Hast Du verstanden, was POLYFIT berechnet? Es werden die Koeffizienten des Polynoms zurückgegeben:
y = a1 * x^2 + a2 * x + a3
Also ist Dein "p" und "q" bereits die Antwort. Ein Auswerten dieser Funktionen geht entweder mittels POLYVAL, man kann dies aber auch einfach in einer eigenen Funktion ausführen lassen.
shalec hat Folgendes geschrieben:
4.) für aufgabe d) lässt sich doch via roots(p) bzw. roots(q) die "nullstellen" der approximationen angeben.. oder gibt es da einen eleganteren und besseren befehl um das ziel dieser aufgabe gekonnt zu bewältigen?
ROOTS ist eine geeignete Funktion um Nullstellen eines Polynoms zu bestimmen.
wie kann ich denn in matlab das ganze entsprechend günstig skalieren?
der programmcode soll nun nichts besonderes darstellen, er entscheidet nur, ob ich den kurs bestanden hab oder nicht (bekomm dafür nur 3cp's und benötige das ganze egtl. nicht fürs studium, ist aber nen pflichtkurs <.<)
und ja, ich hatte polyfit verstanden, aber polyval nicht..^^
um diese aufgabe nun bewältigt zu haben ist jetzt egtl. nur noch die skalierung der schlüssel, richtig?
mit polyfit hab ich den graphen bereits approximiert, mit polyval kann ich ihn dann an antsprechenden stellen auswerten... werde dazu noch ne funktion f schreiben, sodass folgendes passiert:
Eingabe:
f(x)
Ausgabe:
Wert für p an der Stelle x und q an der Stelle x in Matrixschreibweise..
also:
erst so: f=[polyfit(x,y,2) polyfit(x,y,1)]=[p(x) q(x)]
also dass dann die koeffizienten auch in der matrix zu erst stehen und der anwender das ganze nachvollziehen kann.
btw. ist das erste, was ich außer den fibonacci zahlen, in matlab schreibe.. habe vorher noch nie sowas gebraucht o0
-----------------------------
meine idee ist jetzt diese:
damit kann ich nun das einzelne jahr ansteuern.. jetzt noch hinbekommen, dass das in der von mir gewünschten matrix darstellung erscheint.. (möglich auch so: [1;1])
dazu gleich noch ne frage.. meine datei "liste.dat" liegt dort:
Code:
cd f:\uni\
cd '2. semester'
cd computerpraktikum\übung\13
der, der das programm ausführt, bei dem liegt das nicht da wo es bei mir liegt.. kann ich ne m-file machen (ich arbeite mit octave), die via matlab geladen wird und in dem ordner, in dem diese datei liegt, muss dann auch die liste.dat liegen, um dort direkt ohne CD drauf zuzugreifen?
also -> direkte ansprache der LISTE.DAT ohne ordnerpfadspezifisch zu arbeiten?
ich werd gleich noch ein wenig rum experimentieren und dann meinen bisherigen fortschritt stets dokumentieren.. =)
danke an dieser stelle nochmal für die hilfe^^[/code]
Ich weiss nicht, ob es in Octave geht, aber Matlab kann den Pfad des gerade laufenden M-Files bestimmen, so dass Du Ihn für den Dateinamen benutzen kannst:
kannst du mir das vlt schreiben? mein octave weigert sich nen m-file zu erstellen >.<
hier der code, den ich bislang habe, dieser erfüllt aufgabe a-c:
Code:
%zum Plot der Messdaten und damit für Aufgabe a) cd f:\uni\
cd '2. semester'
cd computerpraktikum\übung\13 load liste.dat
x=liste(:,1); y=liste(:,2);
%Interpolation, für späteres Nullstellenberechnen
p=polyfit(x,y,2); q=polyfit(x,y,1);
%quadratische Funktion
function z=f(s);
cd f:\uni\
cd '2. semester'
cd computerpraktikum\übung\13 load liste.dat
x=liste(:,1); y=liste(:,2);
p=polyfit(x,y,2);
z=polyval(p,s);
end
%lineare Funktion
function z=g(s);
cd f:\uni\
cd '2. semester'
cd computerpraktikum\übung\13 load liste.dat
x=liste(:,1); y=liste(:,2);
q=polyfit(x,y,1);
z=polyval(q,s);
end
"Aufgabe a)"
plot(x,y) title('Aufzeichnung der 100m-Lauf Messdaten') xlabel('Jahr') ylabel('Zeit [s]') grid on
"Aufgabe b)"
"Quadratische Funktion f(x)=" p
"Lineare Funktion g(x)=" q
plot(p) title('Approximation via Interpolation einer quadratischen Funktion') xlabel('Jahr [*10^2]') ylabel('Zeit [s]') grid on
plot(q) title('Approximation via Interpolation einer linearen Funktion') xlabel('Jahr [*10^3]') ylabel('Zeit [s]') grid on
"Aufgabe c)"
"Zur Kontrolle: im Jahr 1930 ist ein Läufer so schnell gelaufen:"
["f(1930)=" f(1930);"g(1930)=" g(1930)]
"Im Jahre 2030sind sie dann bereits so schnell:"
["f(2030)=" f(2030);"g(2030)=" g(2030)]
"Weitere Prognosen können mit f(Jahreszahl) oder g(Jahreszahl) angestellt werden. Nun weiter zur endlichen
Prognose, abwann das unmögliche möglich ist:"
"Aufgabe d)"
"Nach der quadratischen Funktion f(x) wird in den Jahren" roots(p) "ein Läufer in 0 Sekunden 100m gelaufen sein!"
"Nach der linearen Funktion g(x) wird im Jahr" roots(q) "ein Läufer 100m in 0 Sekunden zurückgelegt haben."
anstelle dieser cd's würd ich gern eine universelle aufrufe haben..und den gesamten code in einer m-file ladbar zu haben wäre auch super (für den, der es prüfen soll kommt das halt besser..)..
und kann man bei funktionen auch globale opperatoren aufrufen? jedesmal den polyfit zu schreiben verschwendet doch unmengen an speicherplatz.
also den code hätte ich gern in einer aufrufbaren file, und die liste.dat sollte dann im selben ordner liegen und aufgerufen werden können.
dank dir schonmal
edit:\\
hab da jetzt eine .m-file erstellt, mit deinem vorgeschlagenen code..
mein octave gibt mir nen error aus , wenn ich ihm sag "load liste.m"..
hab die datei mal angehangen.. hab ich da irgendwas falsch gemacht?
"Aufgabe d)"
"Nach der quadratischen Funktion f(x) wird in den Jahren" roots(p) "ein Läufer in 0 Sekunden 100m gelaufen sein!"
"Nach der linearen Funktion g(x) wird im Jahr" roots(q) "ein Läufer 100m in 0 Sekunden zurückgelegt haben."
Wenn Du ein Polynom hast, z.B. 2.ten Grades:
y = a2 * x^2 + a1 * x + a0
und wissen möchtest, wann y=0 ist, kannst Du das auch ohne ROOTS lösen - meine ich.
Dein DAT File in ein M-File zu übersetzen sollte nicht schwierig sein.
Code:
load('liste.dat');
[s1, s2] = size(liste);
FID = fopen('Liste.m', 'wb');
fprintf(FID, 'function L = liste\n');
fprintf(FID, 'L = [\n');
for i1 = 1:s1-1 for i2 = 1:s2 - 1 fprintf(FID, '%g, ', liste(i1, i2));
end fprintf(FID, '%g;\n', liste(i1, s2));
end fprintf(FID, '%g];\nreturn\n', liste(s1, s2));
fclose(FID);
Dieses M-file kannst Du nun im gleichen Ordner lagern.
Nebenbei findet WHICH auch Files mit ihrem File Namen.
Ein M-File in Octave zu erstellen ist nicht mein Aufgaben Gebiet.
Platzverschwendung durch wiederholt POLYFIT Aufrufe ist kein ernstes Problem. Ein paar Bytes werden schon noch übrig sein.
Ich selbst bin immer recht zufrieden, wenn ich sehe, dass meine Studenten sich auch in Foren nach Lösungen umschauen. Immerhin gehört zum erfolgreichen Programmieren auch ein koordiniertes Teamwork. Wenn ein Student dann noch seine Quellen angibt, ist das immer ein gutes Zeichen. Falls aber fertige Lösungen gepostet werden, können die Studenten kaum noch nachweisen, dass sie selbst Matlab anwenden können.
"Aufgabe d)"
"Nach der quadratischen Funktion f(x) wird in den Jahren" roots(p) "ein Läufer in 0 Sekunden 100m gelaufen sein!"
"Nach der linearen Funktion g(x) wird im Jahr" roots(q) "ein Läufer 100m in 0 Sekunden zurückgelegt haben."
Wenn Du ein Polynom hast, z.B. 2.ten Grades:
y = a2 * x^2 + a1 * x + a0
und wissen möchtest, wann y=0 ist, kannst Du das auch ohne ROOTS lösen - meine ich.
finde auch, dass ROOTS bei quadratischen Polynomen nicht gerade die beste Lösung ist, werde mir morgen dazu nochmal FZERO angucken. (funktioniert das so: "fzero(f,2000)" um die Nullstelle in der Nähe von 2000 herauszufinden? [müsste dann ja die 2. Nullstelle angeben])
Jan S hat Folgendes geschrieben:
Dein DAT File in ein M-File zu übersetzen sollte nicht schwierig sein.
Code:
load('liste.dat');
[s1, s2] = size(liste);
FID = fopen('Liste.m', 'wb');
fprintf(FID, 'function L = liste\n');
fprintf(FID, 'L = [\n');
for i1 = 1:s1-1 for i2 = 1:s2 - 1 fprintf(FID, '%g, ', liste(i1, i2));
end fprintf(FID, '%g;\n', liste(i1, s2));
end fprintf(FID, '%g];\nreturn\n', liste(s1, s2));
fclose(FID);
Dieses M-file kannst Du nun im gleichen Ordner lagern.
Nebenbei findet WHICH auch Files mit ihrem File Namen.
Jan S hat Folgendes geschrieben:
Ich selbst bin immer recht zufrieden, wenn ich sehe, dass meine Studenten sich auch in Foren nach Lösungen umschauen. Immerhin gehört zum erfolgreichen Programmieren auch ein koordiniertes Teamwork. Wenn ein Student dann noch seine Quellen angibt, ist das immer ein gutes Zeichen. Falls aber fertige Lösungen gepostet werden, können die Studenten kaum noch nachweisen, dass sie selbst Matlab anwenden können.
Gruß, Jan
Ich finde Plaquiate auch immer schrecklich, wenn man etwas nicht kann, sollte man dazu auch stehen..man studiert es ja schließlich um es irgendwie dann mal zu können. ich selbst studiere ja mathematik als vollfach, interessiere mich also nur für die mathematik, nicht fürs rechnen im allgemeinen. was jedoch schrecklicher ist und oft zum plaquiat verleitet, ist der intensive notendruck/leistungsdruck, dass studenten ein thema bis zu einem bestimmten punkt unbedingt verstanden haben müssen, da sie sonst nicht weiter kommen. auch klausuren sind keine wirklichen leistungsüberprüfungen.. generell sagt es nichts über die egtl. denkstruktur aus, nur darüber, wie gut gelernt werden kann.
finds auch traurig, dass seid der bachelor umstellung die meisten prüfungen in der mathematik nun schriftlich sind
naja, ich denke mal, ich hab den kern schonmal soweit fertig, sodass ich nun nur noch den beischmuck, die schöngestaltung, machen sollte. für meinen prof. wäre es dann doch schon schöner, wenn er nicht noch selber den pfad eingeben müsste, wo die datei liegt^^ in html und delphi gabs immer son einfachen befehl wie "...\liste.dat" und schon ist man im selben verzeichnis
aber ist egtl. schon eine bessere methode mit zeigern den speicherort zu suchen um dann dort die datei ausfindig zu machen.
naja liebe grüße und eine gute nacht und vielen dank für die bislang geleistete hilfe!
finde auch, dass ROOTS bei quadratischen Polynomen nicht gerade die beste Lösung ist, werde mir morgen dazu nochmal FZERO angucken. (funktioniert das so: "fzero(f,2000)" um die Nullstelle in der Nähe von 2000 herauszufinden? [müsste dann ja die 2. Nullstelle angeben])
Laut Help-Text ist ROOTS speziell auf Polynome zugeschnitten, während FZERO auch andere Funktionen auswerten kann. Andererseits kann man "0 = a2*x^2 + a1 * x + a0" ja bekanntlicherweise auch mit der PQ-Formel lösen... Da die nun bei naiver Implementation bei Floating-Point-Arithmetik instabil ist, kann man dann als Korrigierender immer sehen, ob die Studenten den Numerik 0 Kurs schon verinnerlicht haben.
Nebenbei: Es gibt natürlich zwei Null-Stellen, möglicherweise natürlich auch komplex-wertige.
Hallo,
ich hab jetzt eine funktionierende alternative gefunden:
Code:
%zum Plot der Messdaten und damit für Aufgabe a)
S = load('liste.dat', '-ascii');
x = S(:,1); y = S(:,2);
%Interpolation, für späteres Nullstellenberechnen
p=polyfit(x,y,2); q=polyfit(x,y,1);
%quadratische Funktion
function z=f(s)
S = load('liste.dat', '-ascii');
x = S(:,1); y = S(:,2);
p=polyfit(x,y,2);
z=polyval(p,s);
end
%lineare Funktion
function z=g(s)
S = load('liste.dat', '-ascii');
x = S(:,1); y = S(:,2);q=polyfit(x,y,1);
z=polyval(q,s);
end
"Aufgabe a)"
plot(x,y) title('Aufzeichnung der 100m-Lauf Messdaten') xlabel('Jahr') ylabel('Zeit [s]') grid on
"Aufgabe b)"
"Quadratische Funktion f(x)=" p
"Lineare Funktion g(x)=" q
plot(p) title('Approximation via Interpolation einer quadratischen Funktion') xlabel('Jahr [*10^2]') ylabel('Zeit [s]') grid on
plot(q) title('Approximation via Interpolation einer linearen Funktion') xlabel('Jahr [*10^3]') ylabel('Zeit [s]') grid on
"Aufgabe c)"
"Zur Kontrolle: im Jahr 1930 ist ein Läufer so schnell gelaufen:"
["f(1930)=" f(1930);"g(1930)=" g(1930)]
"Im Jahre 2030sind sie dann bereits so schnell:"
["f(2030)=" f(2030);"g(2030)=" g(2030)]
"Weitere Prognosen können mit f(Jahreszahl) oder g(Jahreszahl) angestellt werden. Nun weiter zur endlichen Prognose, abwann das unmögliche möglich ist:"
"Aufgabe d)"
"Nach der quadratischen Funktion f(x) wird in den Jahren" fzero(@(x) f(x),2000) "ein Läufer in 0 Sekunden 100m gelaufen sein!"
"Nach der linearen Funktion g(x) wird im Jahr" roots(q) "ein Läufer 100m in 0 Sekunden zurückgelegt haben."
ich muss jetzt nur noch eine für matlab ladbare m-file erstellen, sodass ich das abgeben kann. nur mein octave stellt sich immernoch quer eine .m-file zu laden >.<
-----------------------------------
dann sollte ich noch die rootsausgabe ändern. hab gelesen, dass man den bereich, in dem die nullstellen berechnet werden sollen, eingrenzbar ist. in diese richtung werde ich mal weiter lesen, dann sollte es soweit klappen.
----------done--------------------
wie sieht ein m-file eigentl. vom inhalt her aus? ist dort nur der quelltext unverschlüsselt drin, oder gibts noch irgendwelche kryptischen anweisungen für matlab, die durch das m-file erstellen gemacht wurden?
liebe grüße
Shalec
edit::
wenn ich das ganze als m-file von octave speichere und dann das versuche zu laden, kommt folgender error:
Code:
error: load: abgabe.m: inconsistent number of columns near line2 error: load: unable to extract matrix size from file `abgabe.m'
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.