2016-11-10 2 views
0

Ich habe Probleme zu verstehen, wie man die bilineare Interpolation in Matlab programmiert. In unserer Aufgabe verwenden wir diese Funktion.Bilineare Interpolation in Matlab (ohne eingebaute Funktionen)

B (x, y) = Z_ (ij) + a * (x - x j) + b * (y - yi) + c * (x - x j) (y - yi)

Wir rebuilding 2 Funktionen, eine, die die Koeffizienten berechnet (was ich bereits getan habe und es gab den 'Prüf' Algorithmus vom Professor) und eine andere Funktion, die die Funktion berechnet. Unten ist der Code, den ich habe. Wir erhalten x, y, z, xi und yi, während a, b, c bereits berechnet wurden.

Mein Problem: Die Funktion läuft, aber gibt eine Matrix zurück, wenn es nur einen Vektor zurückgeben soll. Allerdings gibt es die richtigen Werte in Spalte 1, Zeilen 1 & 2, die mich wirklich verwirrt. Außerdem sind die Werte, die wir erhalten, eine quadratische Matrix (z) und 1x2 x und y Werte, im zweiten Teil des Problems gibt es jedoch eine z = mxn Matrix, die keine quadratische Matrix ist, also ist mein Code isn Ich arbeite nicht dafür. Unten ist mein aktueller Code. Jede Hilfe wäre willkommen, aber ich erwarte nicht, dass Sie mir nur die Antwort geben!

%Given x = [0,1], y=[0,1], z=[0,1;2,4], a = 1, b = 2, c = 1, xi = [0,.5],  yi = [0,.5] 

function zi = bilinear_eval(x, y, z, a, b, c, xi, yi) 
    [m,n] = size(z); 
    for j = 1:length(xi) 
     for i = length(x) 
     zi(i,j) = z(j,j) + a*(xi(i) - x(j)) + b*(yi(i) - y(j)) + c*(xi(i) - x(j))*(yi(i) - y(j)) 
     end 
    end 
    end 
+0

Warum sind die 'Python' oder 'C++' Tags hier? –

+0

Wenn Sie eine Vektorausgabe wünschen, sollten Sie 'zi' nicht mit' i' und 'j' indizieren. – excaza

+0

@taylorswift Ich weiß Python und C++, also nehme ich an, wenn jemand in der Lage ist, es in einem dieser Formate zu beantworten, kann ich auch auf Matlab extrapolieren. Aber ich habe sie für dich entfernt. – ovp

Antwort

0

Ich weiß nicht, in welcher Reihenfolge der Interpolation Sie verwenden, aber zu wissen, Lagrange Polynome oder Formfunktionen von Finite-Elemente-Analyse kann hier hilfreich sein.

Wenn ich eine Funktion f hatte (x, y), wo ich zwischen vier Werten zu interpolieren, wollte ich es so schreiben würde:

f(x, y) = f1*N1(r, s) + f2*N2(r, s) + f3*N3(r, s) + f4*N4(r, s) 

wo

-1 <= r <= 1 
-1 <= s <= 1 

und

N1(r, s) = (1-r)*(1-s)/4.0 
N2(r, s) = (1+r)*(1-s)/4.0 
N3(r, s) = (1+r)*(1+s)/4.0 
N4(r, s) = (1-r)*(1+s)/4.0 

Diese Anordnung setzt voraus, dass die vier Punkte so angeordnet sind, dass f1 unten links, f2 unten liegt ht, f3 oben rechts und f4 oben links in einem Viereck.

Die Interpolationsfunktionen liegen im Bereich von Null bis Eins.

Verwandte Themen