未知形状参数矩阵的Scipy曲线拟合

kpbpu008  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(104)

我尝试使用scipy.curve_fit或scipy.least_squares来实现如下函数

def f(x, C): 
    
  r = 0
  for i in range( len(C) ) :
      for j in range( len(C[i]) ):
          r+= x[0]**j * x[1]**i * C[i][j]          
  return r

字符串
其中C是长度定义的运行时间的列表的列表。代码的一个参数是类似[[1., 1.]][[1., 1.], [1.]]的东西,它定义了C的形状。
我试着跟随this answer,但C将是一个NxN矩阵,而curve_fit不能很好地使用矩阵作为输入。我试图定义一个以x, *args为参数的函数,但目前还没有成功。
我还尝试了直接使用least_squares的另一个答案,但在这里我也遇到了一个障碍,那就是我事先不知道行的大小。
我觉得这两个答案的结合对我来说可以起作用,但我不能弄清楚。我想写一个函数,它的参数是C的长度,C[i]的长度列表,然后是C的元素,但我不能写一个工作版本的代码。如果有人对如何做到这一点有一个清晰的理解,或有类似的问题,我会感谢任何帮助。

92dk7w1h

92dk7w1h1#

由于这个问题最近有一些活动,我会回答它,因为我几天后解决了它。我用一个lambda函数解决了这个问题。
我把函数定义为

def f(xy, *args, dimC = 1, dimCi = [2]): 

   x, y = xy # I have to unpack the tuple because a normal list seems to not work

   r = 0

   for i in range( dimC ) :
       for j in range( dimCi[i] ):
           r+= args[i*dimC + j] * x**i * k2**j
        
   return r

字符串
然后我只需要把最初的猜测拉平,我就可以自由调用了

C, cov_C = curve_fit(lambda x, *p: f(x, *p, dimC = dimMat, dimCi = dimMati), ( x, y ), z), p0=init_guess)

相关问题