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

Polynomfunktion umstellen

 

pfeili
Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 07.09.2013, 11:55     Titel: Polynomfunktion umstellen
  Antworten mit Zitat      
Liebe Leute,

ich habe mir aus Messwerten ein Polynom erzeugt, mit:

Code:


Dies liefert mir folgende Koeffizienten:

1.72E-013 7.24E-013 -5.80E-010 -3.01E-009 6,82E-007 3.37E-006 -0.0002675854 -0.0012518884 0.0928903598 -0.0979101638

Dieser Zeilenvektor beinhaltet ja absteigend die Koeffizienten. Nun möchte ich diese Funktion gern nach x umstellen, Werte einsetzen und mir die neuen Funktionswerte ausrechnen lassen. Spalten 2, 3, und 4 sind meine dann einzusetzenden Testdaten:

-75 26.262 6.887 9.818
-73 27.823 7.252 10.843
-71 29.219 7.421 11.518
-69 29.429 7.356 12.019
-67 30.131 7.129 12.563
-65 30.804 7.406 12.926
-63 31.170 7.587 13.217
-61 31.220 7.580 13.586
-59 31.229 7.446 13.725
-57 31.150 7.382 13.717
-55 31.067 7.786 13.460
-53 31.168 7.374 13.592
-51 31.461 7.749 13.524
-49 31.259 7.595 13.798
-47 31.415 7.793 13.713
-45 31.455 7.720 13.341
-43 31.333 7.636 13.775
-41 31.346 7.446 13.101
-39 31.096 7.542 13.167
-37 31.110 7.663 12.865
-35 31.376 6.969 12.682
-33 31.079 7.316 12.200
-31 31.315 7.531 12.053
-29 31.065 7.553 11.583
-27 31.160 7.406 11.604
-25 31.030 6.959 11.401
-23 30.296 6.034 11.246
-21 28.898 4.601 10.645
-19 26.359 2.543 10.250
-17 20.995 0.688 9.171
-15 15.993 -1.764 7.666
-13 8.856 -2.927 5.207
-11 3.555 -3.860 2.695
-9 -1.030 -4.165 0.575
-7 -2.716 -4.131 -1.211
-5 -3.398 -3.705 -2.010
-3 -3.240 -3.442 -2.491
-1 -3.229 -3.143 -2.679
1 -2.829 -2.968 -2.751
3 -3.116 -3.065 -3.071
5 -3.494 -3.379 -3.296
7 -3.922 -3.524 -3.719
9 -4.255 -3.666 -4.044
11 -4.204 -3.539 -4.149
13 -4.053 -2.194 -4.374
15 -2.844 -0.972 -4.749
17 -0.765 1.486 -4.659
19 3.178 2.709 -4.036

Gibt es für die Umstellung und das Einsetzen eine Funktion?

Vielen Dank für eure Hilfe.

pfeili
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 07.09.2013, 11:58     Titel:
  Antworten mit Zitat      
was meinst du mit nach x umstellen ? f(y)=x oder was?
falls du einfach nur das polynom berechnen willst ist das polyval. steht auch in der doc zu polyfit
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 07.09.2013, 12:01     Titel:
  Antworten mit Zitat      
hallo winkow,

danke für deine antwort. ja, ich möchte gern f(y) = x erhalten. ich habe außerdem gesehen, dass die messdaten nicht die richtigen sind. an die korrekten komme ich aber heute nicht ran, weil die auf arbeit liegen. es geht aber ja auch um die prinzipielle vorgehensweise.

viele grüße

pfeili
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: 07.09.2013, 13:39     Titel:
  Antworten mit Zitat      
Hallo,

ich finde es sehr fragwürdig, ein Polynom 9. Grades durch Daten zu legen. Polynome von solch hohem Grad neigen zu Oszillationen. Ich würde versuchen, nach einem Modell zu suchen, dass die Daten wiedergibt. Wenn die Daten nicht verrauscht sind, können auch Splines sinnvoll sein.

Sind die Messwerte monoton steigend oder fallend?
Falls nicht, sind sinnvolle Startwerte bekannt? Anders gefragt: es gäbe dann ja mehrere x-Werte zu einem y-Wert, welcher ist gesucht?

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

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 07.09.2013, 15:38     Titel:
  Antworten mit Zitat      
Hallo Harald,

anbei habe ich einmal den Datensatz angehängt, um den es geht (hab ihn doch noch zusammenbekommen). Die erste Spalte sind die Winkel, die zweite die Funktionswerte. Ich hatte das Polynom erst einmal nur rein optisch so angepasst.

Code:

koeffizienten = polyfit(winkel, k_Beta, 9);
p = polyval(koeffizienten, winkel)
plot(winkel, k_Beta, 'k+', winkel, p, 'k--')
grid
 


Außerhalb des Winkelbereichs interessieren die Funktionswerte nicht, da dort die Kalibrierung nicht gilt.

Viele Grüße

pfeili

k_Beta.txt
 Beschreibung:

Download
 Dateiname:  k_Beta.txt
 Dateigröße:  399 Bytes
 Heruntergeladen:  334 mal
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: 07.09.2013, 18:28     Titel:
  Antworten mit Zitat      
Hallo,

mein Vorschlag:
Code:
load k_Beta.txt
winkel = k_Beta(:,1);
k_Beta = k_Beta(:,2);

zielwerte = -25:15;
passende_winkel = zeros(size(zielwerte));

winkelfein = linspace(min(winkel), max(winkel), 200);
k_Beta_fein = interp1(winkel, k_Beta, winkelfein, 'spline');
for I = 1:numel(zielwerte);
    passende_winkel(I) = fzero(...
        @(w) interp1(winkel, k_Beta, w, 'spline') - zielwerte(I), ...
        [-45, 45]);
end
       

plot(winkel, k_Beta, 'k+', winkelfein, k_Beta_fein, 'g', passende_winkel, zielwerte, 'r*')
grid


Natürlich leidet zum Rand hin die Genauigkeit, da die Messwerte einfach zu weit auseinander liegen.

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

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 07.09.2013, 21:26     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort. Bitte verzeihe, aber ich verstehe die Methode noch nicht ganz. Du verfeinerst den Winkelbereich und interpolierst dort die zugehörigen Funktionswerte. Die Zielwerte werden zukünftig von mir gemessene Funktionswerte sein und der Vektor 'passendeWinkel' sind die Winkel, die ich zukünftig suche. Aber was passiert in der Schleife? Diese Syntax habe ich noch nie gesehen.

Viele Grüße

pfeili
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: 07.09.2013, 22:15     Titel:
  Antworten mit Zitat      
Hallo,

du möchtest im Grunde folgendes nach w auflösen
Code:
interp1(winkel, k_Beta, w, 'spline') = zielwerte(I)

Also folgendes auf 0 setzen:
Code:
interp1(winkel, k_Beta, w, 'spline') - zielwerte(I)

und daraus kann man ein Function Handle basteln, das man von fzero auf 0 setzen lässt.

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

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 08.09.2013, 09:53     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank. Ich werde mich einfach einmal mit

http://www.gomatlab.de/tutorial-kei.....function-handle-t545.html

beschäftigen müssen. Danke nochmals.

Viele Grüße

pfeili
Private Nachricht senden Benutzer-Profile anzeigen
 
pfeili
Themenstarter

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 08.09.2013, 14:08     Titel:
  Antworten mit Zitat      
...muss doch noch mal kurz aufmachen.

Ich habe es jetzt folgendermaßen:

Code:

function [passende_winkel] = WinkelAusk_Beta()
clc
clear all
load messung_0.txt
position = messung_0(:,1);
p_1 = messung_0(:,2);
p_2 = messung_0(:,3);
p_3 = messung_0(:,4);
% Mittelwert aus Druck links und rechts
p_m = (p_2+p_3)./2;
% direction coefficient
k_Beta_Messung = (p_2-p_3)./(p_1-p_m);
fid = fopen('k_Beta_Messung.txt','w');
fprintf(fid, '%i %f\n', [position k_Beta_Messung]');
fclose(fid);
plot(position, k_Beta_Messung)
axis([-75 75 -10 10])
load k_Beta.txt
winkel = k_Beta(:,1);
k_Beta = k_Beta(:,2);

% das sind die in die Funktion einzusetzenden Messwerte
zielwerte = k_Beta_Messung;
% das sind die zu ermittelnden Winkel
passende_winkel = zeros(size(zielwerte));

% existierender Winkelbereich wird feiner aufgeteilt (linearer Abstand, 200 Punkte)
winkelfein = linspace(min(winkel), max(winkel), 200);

% zugehörige Funktionswerte interpolieren
k_Beta_fein = interp1(winkel, k_Beta, winkelfein, 'spline');

for i = 1:numel(zielwerte);
    % Nullstellenberechnung
    passende_winkel(i) = fzero(...
        @(w) interp1(winkel, k_Beta, w, 'spline') - zielwerte(i), ...
        [-45, 45]);
end
       
plot(winkel, k_Beta, 'k+', winkelfein, k_Beta_fein, 'g', passende_winkel, zielwerte, 'r*')
grid
end
 


Wenn ich jetzt allerdings ausführe (Datensatz "k_Beta_Messung.txt" siehe Anhang) kommt folgende Fehlermeldung:

Zitat:

Error using fzero (line 274)
The function values at the interval endpoints must differ in sign.

Error in WinkelAusk_Beta (line 34)
passende_winkel(i) = fzero(...


Was läuft jetzt falsch? Hat er ein Problem mit den Werten, die zu groß sind?

Viele Grüße

pfeili

k_Beta_Messung.txt
 Beschreibung:

Download
 Dateiname:  k_Beta_Messung.txt
 Dateigröße:  983 Bytes
 Heruntergeladen:  300 mal
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: 08.09.2013, 18:00     Titel:
  Antworten mit Zitat      
Hallo,

um das genau nachzuvollziehen, bräuchte man wohl auch noch die andere Datei (messung_0.txt).

An sich braucht man aber nur die Fehlermeldung lesen: die angegebene Funktion hat an den Endpunkten des Intervalls [-45, 45] dasselbe Vorzeichen. fzero will aber, dass sie unterschiedliche Vorzeichen hat (denn dann hat eine stetige Funktion immer eine Nullstelle im Intervall).

Bei deiner k_Messung.txt sehe ich die Probleme, dass die Werte nicht monoton sind. Für Zielwert -0.2 gäbe es z.B. eine Lösung zwischen -73 und -71, eine zwischen -31 und -29, eine zwischen -27 und -25, eine zwischen -9 und -7 (ist die 64 bei -7 wirklich sinnvoll???) , und noch ein paar Stellen. Welche dieser vielen Lösungen sollte denn zurückgegeben werden?

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

Forum-Century

Forum-Century


Beiträge: 177
Anmeldedatum: 27.08.08
Wohnort: ---
Version: R2019b
     Beitrag Verfasst am: 08.09.2013, 21:28     Titel:
  Antworten mit Zitat      
Hallo Harald,

es funktioniert genauso, wie es soll. Probleme gibt es nur bei den Werten, die außerhalb meiner Kalibrierfunktion liegen (bei position=-7 und position = 15). Damit es rechnet, habe ich es jetzt erst einmal so gelöst, auch wenn ich mir hier noch anschauen muss, wie das physikalisch zu deuten ist (es geht um das Vermessen einer Nachlaufdelle eines umströmten Körpers mittels Dreilochsonde).

Code:

function [passende_winkel] = WinkelAusk_Beta()
clc
clear all

load messung_0.txt
position = messung_0(:,1);
p_1 = messung_0(:,2);
p_2 = messung_0(:,3);
p_3 = messung_0(:,4);
% Mittelwert aus Druck links und rechts
p_m = (p_2+p_3)./2;
% direction coefficient
k_Beta_Messung = (p_2-p_3)./(p_1-p_m);
fid = fopen('k_Beta_Messung.txt','w');
fprintf(fid, '%i %f\n', [position k_Beta_Messung]');
fclose(fid);
plot(position, k_Beta_Messung)
grid
%axis([-75 75 -10 10])
load k_Beta_Kalibrierung.txt
winkel = k_Beta_Kalibrierung(:,1);
k_Beta = k_Beta_Kalibrierung(:,2);

% das sind die in die Funktion einzusetzenden Messwerte
zielwerte = k_Beta_Messung;
% das sind die zu ermittelnden Winkel
passende_winkel = zeros(size(zielwerte));

% existierender Winkelbereich wird feiner aufgeteilt (linearer Abstand, 200 Punkte)
winkelfein = linspace(min(winkel), max(winkel), 200);
% zugehörige Funktionswerte interpolieren
k_Beta_fein = interp1(winkel, k_Beta, winkelfein, 'spline');
for i = 1:numel(zielwerte);
    % Nullstellenberechnung
    passende_winkel(i) = fzero(...
        @(w) interp1(winkel, k_Beta, w, 'spline') - zielwerte(i), ...
        [-80, 80]);
end
figure()
plot(winkel, k_Beta, 'k+', winkelfein, k_Beta_fein, 'g', passende_winkel, zielwerte, 'r*')
grid
figure()
plot(position, passende_winkel, 'ko-')
grid
end
 


Anbei noch die Dateien. Eine Extrapolation auf diese Art ist sicher nicht zulässig, aber erst einmal der einzige Weg, der mir einfällt. Ich muss das für die Interpretation berücksichtigen.

Nochmals vielen Dank für deine Hilfe. Das hat mich ein riesiges Stück weitergebracht.

pfeili

messung_0.txt
 Beschreibung:

Download
 Dateiname:  messung_0.txt
 Dateigröße:  1.88 KB
 Heruntergeladen:  307 mal
k_Beta_Messung.txt
 Beschreibung:

Download
 Dateiname:  k_Beta_Messung.txt
 Dateigröße:  983 Bytes
 Heruntergeladen:  287 mal
k_Beta_Kalibrierung.txt
 Beschreibung:

Download
 Dateiname:  k_Beta_Kalibrierung.txt
 Dateigröße:  399 Bytes
 Heruntergeladen:  298 mal
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.