2014-12-19 7 views
1

처음에는 stackoverflow에 대한 놀라운 작업에 대해 모두들 감사드립니다 ... 여러분들은 놀라워하고 이미 꽤 많은 시간을 내게 도와 줬습니다. 내 문제에 대해서 : 나는 vectorfield 플롯하면 내가 (VectorX, VectorY, StartingpointX, StartingpointY) 형식으로 벡터의 시리즈를파이썬의 벡터 필드에 다항식 함수 피팅

data = [(-0.15304757819399128, -0.034405679205349315, -5.42877197265625, 53.412933349609375), (-0.30532995491023485, -0.21523935094046465, -63.36669921875, 91.832427978515625), (-0.15872430479453215, -0.077999419482978283, -67.805389404296875, 81.001983642578125), (-0.36415549211687903, -0.33757147194808113, -59.015228271484375, 82.976226806640625), (0.0, 0.0, 0.0, 0.0), (-0.052973530805275004, 0.098212384392411423, 19.02667236328125, -13.72125244140625), (-0.34318724086483599, 0.17123742336019632, 80.0394287109375, 108.58499145507812), (0.19410169197834648, -0.17635303976555861, -55.603790283203125, -76.298828125), (-0.38774018337716143, -0.0824692384322816, -44.59942626953125, 68.402496337890625), (0.062202543524108478, -0.37219011831012949, -79.828826904296875, -10.764404296875), (-0.56582988168383963, 0.14872365390732512, 39.67657470703125, 97.303192138671875), (0.12496832467900276, -0.12216653754859408, 24.65948486328125, -30.92584228515625)] 

그것은 다음과 같습니다

import numpy as np 
import matplotlib.pyplot as plt 

def main(): 
    # Format Data... 
    numdata = len(data) 
    x = np.zeros(numdata) 
    y = np.zeros(numdata) 
    u = np.zeros(numdata) 
    v = np.zeros(numdata) 
    for i,el in enumerate(data): 
     x[i] = el[2] 
     y[i] = el[3] 
     # length of vector 
     z[i] = math.sqrt(el[0]**2+el[1]**2) 
     u[i] = el[0] 
     v[i] = el[1] 

    # Plot 
    plt.quiver(x,y,u,v) 
    # showing the length with color 
    plt.scatter(x, y, c=z) 
    plt.show() 


main() 

Vector plot

전체 영역에 대해 연속적인 벡터 필드에 맞게 다항식 함수를 만들려고합니다. 몇 가지 연구 끝에 2 차원으로 다항식을 피팅하는 다음 함수를 발견했습니다. 문제는 장착 된 값에 대해 하나의 값만 허용한다는 것입니다.

def polyfit2d(x, y, z, order=3): 
    ncols = (order + 1)**2 
    G = np.zeros((x.size, ncols)) 
    ij = itertools.product(range(order+1), range(order+1)) 
    for k, (i,j) in enumerate(ij): 
     G[:,k] = x**i * y**j 
    m, _, _, _ = np.linalg.lstsq(G, z) 
    return m 

def polyval2d(x, y, m): 
    order = int(np.sqrt(len(m))) - 1 
    ij = itertools.product(range(order+1), range(order+1)) 
    z = np.zeros_like(x) 
    for a, (i,j) in zip(m, ij): 
     z += a * x**i * y**j 
    return z 

또한 벡터의 1 차원 길이에 맞추려고 시도했을 때 polyval2d에서 반환 된 값은 완전히 꺼져있었습니다. 누구든지 눈금의 모든 점에 대해 벡터 (x, y)를 반환하는 맞춤 함수를 얻는 방법을 알고 있습니까?

감사합니다.

답변

0

2-d 벡터 필드에 맞게 다항식은 두 개의 이항 다항식 - 하나는 x- 구성 요소 용이고 다른 하나는 y- 구성 요소 용입니다. 그래서 당신은 두 번 polyfit2d를 호출해야합니다

P(x,y) = (x + x*y, 1 + x + y) 

: 즉, 최종 다항식 피팅과 같을 것입니다. 우리의 벡터 필드는이 예에서

import numpy as np 
import itertools 

def polyfit2d(x, y, z, order=3): 
    ncols = (order + 1)**2 
    G = np.zeros((x.size, ncols)) 
    ij = itertools.product(range(order+1), range(order+1)) 
    for k, (i,j) in enumerate(ij): 
     G[:,k] = x**i * y**j 
    m, _, _, _ = np.linalg.lstsq(G, z) 
    return m 

def fmt1(x,i): 
    if i == 0: 
    return "" 
    elif i == 1: 
    return x 
    else: 
    return x + '^' + str(i) 

def fmt2(i,j): 
    if i == 0: 
    return fmt1('y',j) 
    elif j == 0: 
    return fmt1('x',i) 
    else: 
    return fmt1('x',i) + fmt1('y',j) 

def fmtpoly2(m, order): 
    for (i,j), c in zip(itertools.product(range(order+1), range(order+1)), m): 
    yield ("%f %s" % (c, fmt2(i,j))) 

xs = np.array([ 0, 1, 2, 3]) 
ys = np.array([ 0, 1, 2, 3]) 

zx = np.array([ 0, 2, 6, 12]) 
zy = np.array([ 1, 3, 5, 7]) 

mx = polyfit2d(xs, ys, zx, 2) 
print "x-component(x,y) = ", ' + '.join(fmtpoly2(mx,2)) 

my = polyfit2d(xs, ys, zy, 2) 
print "y-component(x,y) = ", ' + '.join(fmtpoly2(my,2)) 

: 예를 들면 다음과 같습니다 : -

def polyval2d(x, y, m): 
    order = int(np.sqrt(len(m))) - 1 
    ij = itertools.product(range(order+1), range(order+1)) 
    z = np.zeros_like(x) 
    for a, (i,j) in zip(m, ij): 
     z = z + a * x**i * y**j 
    return z 
또한

at (0,0): (0,1) 
at (1,1): (2,3) 
at (2,2): (6,5) 
at (3,3): (12,7) 

, 내가 polyval2d에서 버그를 발견 생각이 버전은보다 정확한 결과를 제공

+0

작동합니다. polyval에서 발견 한 버그는 좋은 힌트였습니다. 고맙습니다! – Martin