Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scipy.optimize.curve\u fit会引发运行时错误_Python_Scipy_Least Squares - Fatal编程技术网

Python scipy.optimize.curve\u fit会引发运行时错误

Python scipy.optimize.curve\u fit会引发运行时错误,python,scipy,least-squares,Python,Scipy,Least Squares,这是我第一次使用curve_fit,我还没有找到与我的问题相匹配的示例。我的问题是,我是否正确使用了曲线拟合数据格式?如果是,那么我的问题是数学问题,我必须纠正它(我还没有发现任何错误…)。 这是我的密码: import numpy as np import math as m import scipy.optimize as sci def f4(X,Tx,Ty,Tz,i,j,k): res=[] #X looks like [x1,y1,z1,x2,y2,z2....] f

这是我第一次使用curve_fit,我还没有找到与我的问题相匹配的示例。我的问题是,我是否正确使用了曲线拟合数据格式?如果是,那么我的问题是数学问题,我必须纠正它(我还没有发现任何错误…)。 这是我的密码:

import numpy as np
import math as m
import scipy.optimize as sci

def f4(X,Tx,Ty,Tz,i,j,k):
    res=[]
#X looks like [x1,y1,z1,x2,y2,z2....]
    for n in range(np.shape(X)[0]/3):
        xr=X[n*3]+Tx+m.cos(j)*m.cos(k)*X[n*3]-m.cos(j)*m.sin(k)*X[n*3+1]+m.sin(j)*X[n*3+2]
        yr=X[n*3+1]+Ty+(m.sin(i)*m.sin(j)*m.cos(k)+m.cos(i)*m.sin(k))*X[n*3]+(-m.sin(i)*m.sin(j)*m.sin(k)+m.cos(i)*m.cos(k))*X[n*3+1]-m.sin(i)*m.cos(j)*X[n*3+2]
        zr=X[n*3+2]+Tz+(-m.cos(i)*m.sin(j)*m.cos(k)+m.sin(i)*m.sin(k))*X[n*3]+(m.cos(i)*m.sin(j)*m.sin(k)+m.sin(i)*m.cos(k))*X[n*3+1]+m.cos(i)*m.cos(j)*X[n*3+2]
        res.append(xr)
        res.append(yr)
        res.append(zr)
    return res

xdata2=[998.362,5000.052,99.4,997.862,5000.052,99.4,998.362,5000.052,98.9,997.862,5000.052,98.9]
ydata2=[999.46555,4999.801,99.4,999.112,5000.15455,99.4,999.46555,4999.801,98.9,999.112,5000.15455,98.9]
p0=[1,0,0,0,0,0.8]

popt,pcov=sci.curve_fit(f4,xdata2,ydata2,p0)
它引发:RuntimeError:未找到最佳参数:函数调用数已达到maxfev=1400

根据我的计算,p0与解非常接近。 我的代码还好吗,还是应该继续寻找数学错误

如果有人好奇的话,我试图找到3个平移和3个旋转,我必须应用于一组点Xp,以获得一组点Xr

任何建议都将不胜感激

编辑1/04:

我尝试了unutbu的方法我改变了我的功能:

def f2(X,Tx,Ty,Tz,i,j,k):
    res=[]
    for n in range(np.shape(X)[0]):
        xr=X[n][0]+Tx+m.cos(j)*m.cos(k)*X[n][0]-m.cos(j)*m.sin(k)*X[n][1]+m.sin(j)*X[n][2]
    yr=X[n][1]+Ty+(m.sin(i)*m.sin(j)*m.cos(k)+m.cos(i)*m.sin(k))*X[n][0]+(-m.sin(i)*m.sin(j)*m.sin(k)+m.cos(i)*m.cos(k))*X[n][1]-m.sin(i)*m.cos(j)*X[n][2]
    zr=X[n][2]+Tz+(-m.cos(i)*m.sin(j)*m.cos(k)+m.sin(i)*m.sin(k))*X[n][0]+(m.cos(i)*m.sin(j)*m.sin(k)+m.sin(i)*m.cos(k))*X[n][1]+m.cos(i)*m.cos(j)*X[n][2]
    aux=[xr,yr,zr]
    res.append(aux)
res=np.array(res)
return res
test=f2(xdata3,1,0.00001,0.00001,0.00001,0.00001,0.8)

In [17]:test
Out[17]:
array([[-1891.88925911,  9199.80185261,   198.87092002],
   [-1892.73761247,  9199.44317456,   198.87091992],
   [-1891.88926411,  9199.80185761,   197.87092002],
   [-1892.73761747,  9199.44317956,   197.87091992],
   [-1890.4366777 ,  9199.91400129,   197.87091663],
   [-1890.4366727 ,  9199.91399629,   198.87091663]])
我在阵列中添加了两点:

xdata3=np.array([[998.362,5000.052,99.4],[997.862,5000.052,99.4],[998.362,5000.052,98.9],[997.862,5000.052,98.9],[999.112,4999.801,98.9],[999.112,4999.801,99.4]])
ydata3=np.array([[999.46555,4999.801,99.4],[999.112,5000.15455,99.4],[999.46555,4999.801,98.9],[999.112,5000.15455,98.9],[1000.112,4999.801,98.9],[1000.112,4999.801,99.4]])
我尝试了以下功能:

def f2(X,Tx,Ty,Tz,i,j,k):
    res=[]
    for n in range(np.shape(X)[0]):
        xr=X[n][0]+Tx+m.cos(j)*m.cos(k)*X[n][0]-m.cos(j)*m.sin(k)*X[n][1]+m.sin(j)*X[n][2]
    yr=X[n][1]+Ty+(m.sin(i)*m.sin(j)*m.cos(k)+m.cos(i)*m.sin(k))*X[n][0]+(-m.sin(i)*m.sin(j)*m.sin(k)+m.cos(i)*m.cos(k))*X[n][1]-m.sin(i)*m.cos(j)*X[n][2]
    zr=X[n][2]+Tz+(-m.cos(i)*m.sin(j)*m.cos(k)+m.sin(i)*m.sin(k))*X[n][0]+(m.cos(i)*m.sin(j)*m.sin(k)+m.sin(i)*m.cos(k))*X[n][1]+m.cos(i)*m.cos(j)*X[n][2]
    aux=[xr,yr,zr]
    res.append(aux)
res=np.array(res)
return res
test=f2(xdata3,1,0.00001,0.00001,0.00001,0.00001,0.8)

In [17]:test
Out[17]:
array([[-1891.88925911,  9199.80185261,   198.87092002],
   [-1892.73761247,  9199.44317456,   198.87091992],
   [-1891.88926411,  9199.80185761,   197.87092002],
   [-1892.73761747,  9199.44317956,   197.87091992],
   [-1890.4366777 ,  9199.91400129,   197.87091663],
   [-1890.4366727 ,  9199.91399629,   198.87091663]])
也更改了p0:

p0=[1,0.00001,0.00001,0.00001,0.00001,0.8]
然后我尝试了曲线拟合:

test=f2(xdata3,1,0.00001,0.00001,0.00001,0.00001,0.8)
我有一个不同的错误:

error: Result from function call is not a proper array of floats. 

不确定发生了什么,因为我的测试变量看起来很好。

对于某些拟合例程,不应该在0.0开始初始参数。可能希望尝试将其设置为较小但非零的值(1e-6)

我认为问题完全在于您对模型函数的选择。 数据根本不符合那个模型

如果要使用平移和旋转来拟合数据,可能需要 我们正在寻找的更像是
f4
(以下),其中

  • 查找对象的质心,
    Xbar
    X-Xbar
    将对象移回更靠近原点的位置
  • 围绕原点旋转
    X-Xbar
    (使用
    np.dot(R,X-Xbar)
    ),然后
  • 通过
    T+Xbar
    进行翻译
(注意,与原始版本不同
f4
,它也不会通过
X
进行翻译)


屈服

[  1.17677500e+00  -7.42250000e-02  -4.02305065e-37  -1.28557241e-20
  -1.61334110e-20  -7.85398164e-01]

我真的不明白为什么我没有足够的数据。我正在寻找3个平移和3个旋转,这是6个参数。我得到了4分,12个值。我设法使它在一个线性最小二乘程序中适用于小角度:我用1近似cos(角度),用角度近似sin(角度)。它给了我一个线性系统。这就是我通常使用它的方式,因为我习惯于寻找测地线系统之间的变换,这些变换中的角度非常小。是的,它工作得很好!谢谢。它没有给我我所期望的,但我会检查一下,我的数学可能有点生疏。对不起,如果我的数学太满了,但是如果它在f4给出的结果中没有转化为X,这是一个问题吗?因为方程是Y=X+T+RX。如果这不重要,我如何在变换后找到点(x,y,z)的坐标。是T+RX吗?我尝试添加X作为平移,但我得到了运行时错误我只是尝试将ydata与R*xdata+T的结果进行比较:两个点上的差值约为40cm,另两个点上的差值为20cm(我的数据描述了平移和旋转前与X轴平行的立方体面)。非常奇怪,您使用的是
X=X.reforme(-1,3).T
?我的帖子的早期版本有
X=X.reforme(3,-1)
,这是错误的。。。