Interpolation einer Funktion in Abhängigkeit mehrerer Variablen

Neue Frage »

Multi_Interpolation Auf diesen Beitrag antworten »
Interpolation einer Funktion in Abhängigkeit mehrerer Variablen
Meine Frage:
Ich möchte gerne eine Funktion f(x,y,z) interpolieren, die von 3 Variablen x, y und z abhängt. Allerdings habe ich keine Information darüber, wie diese aussieht. Es könnte eine lineare Funktion sein, ein Polynom bis zum dritten Grad oder sogar ein Bruch. Im Folgenden gebe ich ein paar Werte an, die ich kenne:

f(73,30,10)=1461
f(73,52,14)=1695
f(73,57,13)=1981
f(73,61,15)=1789
f(74,74,16)=1981
f(78,63,16)=1880
f(82,60,16)=1886
f(82,66,18)=1696
f(82,67,17)=1927

Wie bekomme ich die Funktion raus???

Meine Ideen:
Hätte ich sehr sehr viele Funktionswerte, hätte ich die Funktion hinsichtlich der Veränderung einer Variable untersucht. Da ich aber nur 9 Werte habe geht das schlecht...
Ich tippe, dass es ein Bruch ist, der vielleicht folgende Form hat:
f(x,y,z)=(a*x+b*y)/(c*z)
Was aber auf oder unterhalb des Bruchs steht ist nur geraten und stimmt auch nicht, wenn man die Zahlen oben einsetzt.
Über Hilfe würde ich mich sehr freuen =)
Lampe16 Auf diesen Beitrag antworten »
RE: Interpolation einer Funktion in Abhängigkeit mehrerer Variablen
Interpolieren setzt immer einen Entschluss voraus, wie man interpolieren will. Wenn die Daten einen Ansatz exakt erfüllen, weil sie fingiert (rechnerisch erzeugt) sind, läuft das Finden das Ansatzes auf Raten oder Befragen des Rätselautors hinaus.
Lampe16 Auf diesen Beitrag antworten »
RE: Interpolation einer Funktion in Abhängigkeit mehrerer Variablen
Prosit Neujahr!
Ich komme auf deine eigentliche Frage zurück. Das Problem sind die nicht monotonen und nicht äquidistanten Koordinaten x,y,z. Die gängigen Verfahren verlangen das Gegenteil.
Ich kenne keine Methode für diesen Fall. Dass es wirklich keine gibt, ist eher unwahrscheinlich. Interpolation und Approximation sind ja Gebiete, die Numeriker rauf- und runterbeten.
Trotzdem habe ich selber was gebastelt, Code s.u.. Der Ansatz beruht auf der Idee, zur Approximation (nicht Interpolation) ein gewichtetes Mittel der den Approximationspunkt umgebenden Werte zu nehmen, wobei die Gewichte mit der Entfernung der Stützpunkte abnehmen.

Das Verfahren funktioniert ganz ordentlich (s. Graphik zum Code). Angenehm ist, dass man keinen parametrierten Ansatz benötigt. Man darf sich allerdings nicht daran stören, dass die Stützstellen mit einem kleinen Fehler reproduziert werden. Es ist eben keine Interpolation, sondern eine Approximation.

Das unten codierte Verfahren
Gegeben:

Approximationsstelle

Gesucht:
w-Approximation fürr eine beliebige Stelle im Gebiet der Stützstellen

Verfahren:









Charakteristischer Abstand, zu wählende Größe Ausdehnung des Stützstellengebiets

----------------------------------------------------------------------------------
//Approximation einer Wertetabelle w(x,y,z) bei nicht äqidistanten, nicht monotonen x, y, z
//Sprache: Freeware Scilab 5.2
//A Erzeugung von Dummy-Daten X=[x;y;z] und w
nw=9; //Anzahl Stützkoordinaten pro Dimension
x_=linspace(0,5,nw); y_=x_; z_=x_; //hier nur bequemlichkeitshalber monoton und äquidistant
[X_,Y_,Z_]=ndgrid(x_,y_,z_); //nw*nw*nw - Hypermatrizen
W_=X_.^2 + Y_.^2 + Z_.^2;
x=matrix(X_,1,nw^3); y=matrix(Y_,1,nw^3); z=matrix(Z_,1,nw^3); w=matrix(W_,1,nw^3);
X=[x;y;z]; // 3*nw*nw*nw - Matrix mit den Stützstellen-Vektoren (SV) als Spalten

//B Approximationsfunktion, ansatzfrei (enziger Parameter ac2)
function wp=interpoly(xp,X,w,ac2)//3D-Approximation bei unregelmäßigen Stützkoordinaten
//xp: Vektor 3*1, Approximationsstelle (AS)
//X: Matrix [x;y;z] mit den Stützstellen-Vektoren (SS) als Spalten (s.o.)
//w: Werte an den Stützstellen
//wp: Approximationswert
//ac2: Abstandsquadrat-Konstante: Punkte im Abstand >5*sqrt(ac2) werden praktisch ignoriert.
// ac2 ist vom Anwender zu wählen, bei Bedarf per (skript-externer) Optimierung
n=length(w); //Anzahl Stützstellen
Xp=xp*ones(1,n) //Matrix mit Wiederholungen von xp
a2=sum((Xp-X).^2,'r') //quadrierte Abstände zwischen der AS und den SS
G=exp(-a2/ac2) //Absolute Gewichte
Gsum=sum(G) //Summe der Gewichte
g=G/Gsum //relative Gewichte
wp=sum(g.*w,'c')//Näherungswert (statt Interpolationswert)
endfunction

//C Kontrolle des Verfahrens mit Zufallswerten
ac2=0.2; //Abstandsquadrat-Konstante für Gewichtung, hier griffweise
//gewählt, probieren! ggfls. mittlere Abweichung (RMS, s.u.) minimieren.
Wp=[]; Wp!=[]; //Initialisierung
for i=1:100 //Schleife für 100 Zufalls-AS
xp=5*rand(3,1); //Koordinaten sind Werte aus gleichmäßiger Verteilung von 0...5
wp=interpoly(xp,X,w,ac2); //approximierter Wert
Wp=[Wp wp];
wp!=xp(1)^2+xp(2)^2+xp(3)^2; //richtiger Wert
Wp!=[Wp! wp!];
end
RMS=sqrt(1/100*sum((Wp-Wp!).^2)) //Mittlere (quarat.) Abweichung
//Graphik
xdel();
plot(0,80, [1:100],Wp,'g.',[1:100],Wp!,'or')
cax=gca(); //axes
cax.data_bounds = [0,0;100,100];
cc1=cax.children;//compound 1
ccp1=cc1.children(1);//polyline 1
ccp1.mark_size_unit = "point";
ccp1.mark_size = 10;
ccp1.mark_foreground = 5;
ccp1.mark_background = 0;
ccp2=cc1.children(2);//compound 2
ccp2.mark_size_unit = "point";//polyline 2
ccp2.mark_size = 5;
ccp2.mark_foreground = 3;
ccp2.mark_background = 0;
title('Vergleich')
xstring(7,90,['Richtiger Wert: roter Kreis';'Approximation: grüner Punkt'])
xlabel('Lfd. Nummer der Approximationsstelle')
ylabel('Wert')
--------------------------------------------------------------------------------------------------------
Lampe16 Auf diesen Beitrag antworten »

Hallo Multi_Interpolation!
Ich habe vor 10 Tagen meine Antwort auf deine Anfrage ausführlich mit einem Code und einer Graphik ergänzt und sei seit dem nichts von dir gehört. So gar kein Feedback zu bekommen - Ist meine Antwort ins Leere gegangen, unbrauchbar oder vielleicht tatsächlich nützlich usw. ? - ist nicht motivierend für meine Mitarbeit im Board. Also: Versuch bitte, außer deiner Frage auch eine Antwort zu geben.
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »