Wurzel eines Polynoms in Matla < Mathe-Software < Mathe < Vorhilfe
|
|
Hi,
> Hallo zusammen,
>
> ich arbeite derzeit an meiner Studienarbeit und muss dazu
> einige Messwerte in MATLAB auswerten.
> Dabei muss ich unter anderem den Krümmungsradius eines
> Polynoms, welches ich bereits aus den Messwerten
> interpoliert habe, bestimmen.
>
> Den Radius möchte ich nach
> dieser Gleichung
> bestimmen.
>
> Ich weiß, dass ich zum Quadrieren des Befehl "conv" und zum
> Dividieren "deconv" benötige.
> Aber wie stelle ich das "hoch einhalb" dar?
> Elementenweises Wurzelziehen ist ja nicht möglich, da sich
> ja auch die Ordnung und damit die Länge des Vektors
> ändert... Der Befehl "sqrtm" führt auch zu einer
> Fehlermeldung...
>
wenn ich dich richtig verstehe, moechtest du deine polynome 'symbolisch' verarbeiten, also nur auf basis der koeffizienten. ich bin mir nicht sicher, ob das möglich, aber auch zweckmäßig, ist.
kannst du nicht einfach dein polynom auf einem hinreichend feinen gitter auswerten und dann sämtliche manipulationen, inkl. der ableitungen, auf dem diskreten gitter vornehmen? das ist straight forward.
gruss
matthias
|
|
|
|
|
Genau, ich möchte auf Basis der Koeffizienten weiterarbeiten.
Du meinst, dass ich quasi das interpolierte Polynom an einzelnen Stellen diskret auswerte, ebenso die Ableitungen und dann aus den einzelnen "Zahlen" die Wurzel ziehe?
Das wäre eine Möglichkeit, die ich nur sehr sehr ungern einschlagen würde, da dies die Genauigkeit meiner Arbeit weiter herabsetzen würde.
Gibt es denn wirklich keinen Befehl, den ich in Matlab gebrauchen könnte?
Auf einer anderen Seite habe ich eine Formel gefunden, die ebenfalls den Radius beschreiben soll. Kann mir jemand sagen ob diese Formel wirklich das gleiche beschreibt wie die, die ich oben verlinkt habe?
Sie lautet:
[mm] r = \bruch{f'(x)^3}{( f'(x) * f''(x) )} [/mm]
|
|
|
|
|
> Genau, ich möchte auf Basis der Koeffizienten
> weiterarbeiten.
>
> Du meinst, dass ich quasi das interpolierte Polynom an
> einzelnen Stellen diskret auswerte, ebenso die Ableitungen
> und dann aus den einzelnen "Zahlen" die Wurzel ziehe?
> Das wäre eine Möglichkeit, die ich nur sehr sehr ungern
> einschlagen würde, da dies die Genauigkeit meiner Arbeit
> weiter herabsetzen würde.
das haengt davon ab. Welche Ordnung hat denn das interpolierende polynom? und ist es wirklich eine interpolation oder nur eine regression? Im letzteren fall haettest du ja eh schon einen betraechtlichen fehler. dagegen ist der fehler bei zb. numerischer differentiation denke ich zu vernachlaessigen.
>
> Gibt es denn wirklich keinen Befehl, den ich in Matlab
> gebrauchen könnte?
>
ich kein algebraiker, aber symbolisches radizieren von polynomen ist doch im allgemeinen gar nicht moeglich: nimm als einfaches beispiel $p(x)=(x+1)(x+2)$. Was soll denn das wurzelpoynom von p sein?
gruss
matthias
|
|
|
|
|
Hallo Matthias,
die Ordnung des Polynoms schwankt zwischen 100 und 400. Die Anzahl der Messwerte schwankt zwischen 20000 ud 80000 Wertepaaren. Diese unterziehe ich dann einem Smoothing, bevor ich sie interpoliere (aus diesem Grund möchte ich das weitere Verarbeiten diskreter Werte vermeiden!). Ja, es handelt sich um eine wirkliche Interpolation (Befehl polyfit --> Koeffizienten).
Bei dem von dir genannten Beispiel kann ich ja die Klammern auflösen und dann die Koeefizienten in den Vektor schreiben.
Nur: Wie bildet man dann z. B. ein Polynom der Form " x + [mm] \wurzel{x} [/mm] + 1 " in Matlab dann überhaupt ab? In so einem Fall ist die vektorielle Darstellung der Koeefizienten völlig unbrauchbar, richtig?
Das Multiplizieren und Dividieren von Polynomen in vektorieller Form ist ja dank "conv" und "deconv" kein Problem. Nur an dem "hoch 1/2" hänge ich. Dafür finde ich halt einfach keinen Befehl.
Bliebe dein Vorschlag mit der Abbildug auf ein genügend kleines Gitter. Damit meinst du dann wohl, dass ich das Polynom allgemein ableite und dann lediglich für Punkte in hinreichend kleiner Entfernung zueinander die Wurzel bestimme?
Dann müsste ich diese Punkte aber wiederum interpolieren um den Radius als ganze Funktion zu erhalten...
|
|
|
|
|
Hi,
> Hallo Matthias,
>
> die Ordnung des Polynoms schwankt zwischen 100 und 400. Die
> Anzahl der Messwerte schwankt zwischen 20000 ud 80000
> Wertepaaren. Diese unterziehe ich dann einem Smoothing,
> bevor ich sie interpoliere (aus diesem Grund möchte ich das
> weitere Verarbeiten diskreter Werte vermeiden!). Ja, es
> handelt sich um eine wirkliche Interpolation (Befehl
> polyfit --> Koeffizienten).
Hm, bin nicht wirklich ein experte auf diesem gebiet, aber macht es wirklich sinn, mit einem so 'hochordrigen' polynom zu interpolieren? fuehrt das nicht zu unschoenen oszillationen? hast du es nicht mal mit splines versucht?
>
> Bei dem von dir genannten Beispiel kann ich ja die Klammern
> auflösen und dann die Koeefizienten in den Vektor
> schreiben.
das ist mir klar, aber es bleibt die frage, wie du fuer so ein polynom die wurzel definieren willst. Aus meiner sicht ist das in diesem beispiel und im allgemeinen nicht moeglich.
>
> Nur: Wie bildet man dann z. B. ein Polynom der Form " x +
> [mm]\wurzel{x}[/mm] + 1 " in Matlab dann überhaupt ab? In so einem
> Fall ist die vektorielle Darstellung der Koeefizienten
> völlig unbrauchbar, richtig?
das ist dann einfach kein polynom mehr.
>
> Das Multiplizieren und Dividieren von Polynomen in
> vektorieller Form ist ja dank "conv" und "deconv" kein
> Problem. Nur an dem "hoch 1/2" hänge ich. Dafür finde ich
> halt einfach keinen Befehl.
>
>
> Bliebe dein Vorschlag mit der Abbildug auf ein genügend
> kleines Gitter. Damit meinst du dann wohl, dass ich das
> Polynom allgemein ableite und dann lediglich für Punkte in
> hinreichend kleiner Entfernung zueinander die Wurzel
> bestimme?
das waere eine moeglichkeit. fuehre die differentiation symbolisch durch, werte fkt. und ableitungen auf einem gitter aus und berechne dann die kruemmungsfunktion auf dem gitter. Das ist aus meiner sicht eine absolut saubere vorgehensweise, gegen die nichts zu sagen ist.
>
> Dann müsste ich diese Punkte aber wiederum interpolieren um
> den Radius als ganze Funktion zu erhalten...
wieso brauchst du den radius als ganze funktion (dh. polynom?)?
gruss
matthias
|
|
|
|
|
Hallo Matthias,
also ich habe das jetzt so programmiert, wie du es mir geraten hast !
Die Werte der Ableitungen habe ich für meine einzelnen Messpunkte (das ist ja quasi das Gitter, von dem du sprachst, oder?) ausgerechnet und dann nach der allgemeinen Krümmungskreis-Formel bestimmt. Hat alles super geklappt ! Vielen Dank !
Soe sieht's jetzt aus:
d1 = polyder(p);
d2 = polyder(d1);
x = linspace(0,10);
P = polyval(p,x);
D1 = polyval(d1,x);
D2 = polyval(d2,x);
v = ones(1,length(D1));
zaehler = abs((v+D1.^2).^(1.5));
nenner = abs(D2);
rad = zaehler./nenner;
Falls doch noch ein Problem auftaucht, melde ich mich wieder!
Herzlichen Dank für deine Hilfe, Matthias!
Grüße nach Neuseeland!
Markus
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 09:20 So 20.04.2008 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|