多项式拟合通过1点与力衍生要去= 0
我正在寻找类似numpy.polyfit
我有一个固定点,看起来像一个度2多项式多项式拟合通过1点与力衍生要去= 0
我想要做的是一个曲线的东西:
- 通过所述第一点去精确地(在下面的例子中
(0.05 , 1.0)
) - 在第一点上有一个
derivative =0
例如:
TabX
:
0,050 ; 0,055 ; 0,060 ; 0,065 ; 0,070 ; 0,075 ; 0,080 ; 0,085 ; 0,090 ; 0,095 ; 0,100 ; 0,110 ; 0,120 ; 0,130 ; 0,140 ; 0,150 ; 0,160 ; 0,170 ; 0,180 ; 0,190 ; 0,200 ; 0,210 ; 0,220 ; 0,230 ; 0,243
TabY
:
1,000000000 ; 1,000446069 ; 1,000395689 ; 1,000359466 ; 1,000313867 ; 0,999937484 ; 0,999760969 ; 0,999811533 ; 0,999966352 ; 0,999767956 ; 1,000148567 ; 1,000634904 ; 1,000735849 ; 1,001199937 ; 1,001510678 ; 1,001722496 ; 1,001992602 ; 1,002487029 ; 1,003492247 ; 1,004006533 ; 1,004832845 ; 1,005730132 ; 1,006327527 ; 1,007109894 ; 1,008266254
我已经找到了通过第一点去一个 “简单而野蛮” 的解决方案:我补充了很多的重量到这一点,无论是重量功能,还是在TabX
中增加大量的0.05
以及TabY
中的很多1.0
和使用正常的np.polyfit函数。这是丑陋的,但它的工作。
但我真的不知道怎么过的点(0.05;1.0)
也derivative=0
,在this thread据说拉格朗日乘数可以做的伎俩,但我不能够使用由@编写的功能海梅,我有凸起的错误LinAlgError, 'Singular matrix'
而且,我必须能够在一个基本Abaqus
启动此脚本,该解决方案可以只使用基本的python 2.7
和numpy
。在这个实现中没有办法使用scipy
或matplotlib
。
_____________________________________________________________________
编辑:使用DanielF答案,我可以做的东西halfworking(也感谢您DanielF的指正在我原来的职位,更易于阅读)
使用新的原点是好主意 但是,我不能让它高效与我的数据 这是工作:
def WorkingDeg4():
x = np.arange(100)
y0 = 4.0*x**4+0.07 * x ** 3 + 0.3 * x ** 2 + 1.1 * x
y = y0 + 1000 * np.random.randn(x.shape[0])
XX = np.vstack((x**4,x ** 3, x ** 2, x, np.ones_like(x))).T
p_all = np.linalg.lstsq(XX, y)[0]
pp = np.polyfit(x, y, 3)
p_no_offset = np.linalg.lstsq(XX[:, :-1], y)[0]
y_fit = np.dot(p_no_offset, XX[:, :-1].T)
for i in range(0,len(x)):
print x[i],y0[i],y[i],y_fit[i]
但是,如果我想使INT使用主我的数据 我把:
if __name__ == '__main__':
MyDataX=[0.050 , 0.055 , 0.060 , [...], 0.243]
MyDataY=[1.000000000 , 1.000446069 , 1.000395689 , [...] , 1.008266254]
TabX=[0.0]*len(MyDataX)
TabY=[0.0]*len(MyDataY)
for i in range(0,len(TabX)):
TabX[i]=MyDataX[i]-MyDataX[0]
TabY[i]=MyDataY[i]-MyDataY[0]
所以,在这一点上,我做了“回到原点”的阶段
,我想这样做相同def Working
但我的数据,所以我做了TGE WorkingDeg4的拷贝过去,只是去除掉创建x和y的,放入参数
def NOTWorkingDeg4 (x,y):
XX = np.vstack((x**4,x ** 3, x ** 2, x, np.ones_like(x))).T
p_all = np.linalg.lstsq(XX, y)[0]
pp = np.polyfit(x, y, 3)
p_no_offset = np.linalg.lstsq(XX[:, :-1], y)[0]
y_fit = np.dot(p_no_offset, XX[:, :-1].T)
和这个人是不工作... 。我有一个mystake在行
XX = np.vstack((x**4,x ** 3, x ** 2, x, np.ones_like(x))).T
说TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
所以对于我的理解,它不希望这样做,因为我当它x**4
,x是不是整数。但我不知道烫去解决问题
_____________________________________________________________________ 编辑2:发现: 的问题是启动TABX和泰比,而不是阵列,而是作为np.array 错误:
TabX=[0.0]*len(MyDataX)
TabY=[0.0]*len(MyDataY)
右:
TabX=np.array([0.0]*len(LongueursFissureGlobale))
TabY=np.array([0.0]*len(CourbeInterpolationGlobale))
你可能会想改变你的数据,以便(0.05, 1.0)
是你的出身(0, 0)
,让您计算变得更容易,然后做一个numpy.linalg.lstsq
x = TabX - 0.05
y = TabY - 1.0
X_poly = np.vstack((x ** 4, x ** 3, x ** 2))
poly_coeffs = np.linalg.lstsq(X_poly.T, y)
y_fit = np.dot(poly_coeffs, X_poly)
如果它需要的话,你就必须改变多项式回到旧的坐标,但这种转变使得安装更加简单。
查看This answer了解更多详情。
Aaah'abaqus'。我知道那痛苦。 –
你可能会想要移动你的数据,以便'(0.5,1.0)'是你的原点'(0,0)',以便让你的计算更容易,然后做一个'numpy.linalg.lstsq'。请参阅[本答案](https://*.com/questions/32260204/numpy-polyfit-passing-through-0)。然后,您可以将一阶导数设置为零,不仅可以从'a'矩阵中删除常量,而且还可以从'x'值中删除常量。 –
如果你看看如何计算这种最小化,应该很容易推导出修改后的公式。几小时后会写点东西。 –