Interpolation einer Funktion in Abhängigkeit mehrerer Variablen |
31.12.2010, 02:32 | Multi_Interpolation | Auf diesen Beitrag antworten » |
Interpolation einer Funktion in Abhängigkeit mehrerer Variablen 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 =) |
||
31.12.2010, 17:16 | 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. |
||
01.01.2011, 18:21 | 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') -------------------------------------------------------------------------------------------------------- |
||
11.01.2011, 09:48 | 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. |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |
|