polyfit2d
다음의 구현은이 문제에 대한 해결책이 매우 우아 가능한 NumPy와 방법을 numpy.polynomial.polynomial.polyvander2d
및 numpy.polynomial.polynomial.polyval2d
#!/usr/bin/env python3
import unittest
def polyfit2d(x, y, f, deg):
from numpy.polynomial import polynomial
import numpy as np
x = np.asarray(x)
y = np.asarray(y)
f = np.asarray(f)
deg = np.asarray(deg)
vander = polynomial.polyvander2d(x, y, deg)
vander = vander.reshape((-1,vander.shape[-1]))
f = f.reshape((vander.shape[0],))
c = np.linalg.lstsq(vander, f)[0]
return c.reshape(deg+1)
class MyTest(unittest.TestCase):
def setUp(self):
return self
def test_1(self):
self._test_fit(
[-1,2,3],
[ 4,5,6],
[[1,2,3],[4,5,6],[7,8,9]],
[2,2])
def test_2(self):
self._test_fit(
[-1,2],
[ 4,5],
[[1,2],[4,5]],
[1,1])
def test_3(self):
self._test_fit(
[-1,2,3],
[ 4,5],
[[1,2],[4,5],[7,8]],
[2,1])
def test_4(self):
self._test_fit(
[-1,2,3],
[ 4,5],
[[1,2],[4,5],[0,0]],
[2,1])
def test_5(self):
self._test_fit(
[-1,2,3],
[ 4,5],
[[1,2],[4,5],[0,0]],
[1,1])
def _test_fit(self, x, y, c, deg):
from numpy.polynomial import polynomial
import numpy as np
X = np.array(np.meshgrid(x,y))
f = polynomial.polyval2d(X[0], X[1], c)
c1 = polyfit2d(X[0], X[1], f, deg)
np.testing.assert_allclose(c1,
np.asarray(c)[:deg[0]+1,:deg[1]+1],
atol=1e-12)
unittest.main()
를 이용한다. 나는 당신이 공유하고 싶은 약간의 수정과 함께 타원형 포물면에 맞게 제안 된 코드를 사용했다. 저는 선형 솔루션을'z = a * (x-x0) ** 2 + b * (y-y0) ** 2 + c' 형식으로 맞추는 데 관심이있었습니다. 내 변경 사항 전체 코드는 [여기] (http://www.nublia.com/dev/stackoverflow/stow_polyfit2d.py)에서 볼 수 있습니다. – regeirk
참고 : 최근 버전의 numpy에 대해서는 아래의 @ klaus의 대답을 참조하십시오. 내 원래의 대답'polyvander2d' 등은 존재하지 않았지만, 요즘 갈 길입니다. –
이 정말 3 차 다항식입니까? 내가 틀린 것을 이해하지 못한다면 오더 6의 'X ** 3 * Y ** 3'이라는 용어를 쓰지 않을 것인가? – maxymoo