多变量曲线拟合Python

ds97pgxw  于 2023-06-04  发布在  Python
关注(0)|答案(2)|浏览(146)
import pandas as pd
import math
import numpy as np
from scipy.optimize
import curve_fit
L_data = np.array([0.856, 0.451])
t_data = np.array([0.398, 0.507])
y_data = np.array([0.63, 0.5])
def model(x, c1, c2):
  x = ([L, t])
return ((480 / c2) * (math.sqrt(((1 + (c1 ** 2)) / 3)) * np.cos((L * math.pi) / 6)) + c1 * (t + (1 / 3) * np.sin((L * math.pi) / 6))) ** (-1 / 0.19741)
xd = [L_data, t_data]
p0 = 0.003, 231
popt, pcov = curve_fit(model, xd, y_data, p0)

我试图曲线拟合一个多变量模型与2个参数没有任何运气。我发现的文档主要关注单个变量。我试着跟随其他关于链接和解包的帖子,但我一直得到这个错误消息“TypeError:can 't multiply sequence by non-int of type 'float'"错误链接到代码的最后一行。除了这个错误,我还需要修改代码以获得更好的解决方案吗?
y是模型的输出。
我是Python新手,所以任何帮助都很感激。谢谢
我尝试将输入更改为np.array,但这并没有解决问题

67up9zun

67up9zun1#

在你的代码中,你试图用一个浮点数乘以一个数组,就像这个例子一样;

>>> a = [2,3]
>>> a * 2
[2, 3, 2, 3]
>>> a * 2.3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'

对于多元曲线拟合,请选中此answer

bbmckpt7

bbmckpt72#

这不是曲线拟合问题;你只有两个数据点这实际上是一个二维的寻根问题。
以下内容修复了大部分问题,包括解包问题;但如何更好地配合,已超出了这个问题的范围。

import numpy as np
from scipy.optimize import root

def model(x: np.ndarray, c1: float, c2: float) -> np.ndarray:
    L, t = x
    y = (
        480/c2
        * np.sqrt((1 + c1**2)/3)
        * np.cos(L*np.pi/6)
        + c1*(
            t + np.sin(L*np.pi/6)/3
        )
    )**(-1 / 0.19741)
    return y

def err(c: np.ndarray) -> np.ndarray:
    y = model(xd, *c)
    err = y - y_data
    return err

L_data = np.array((0.856, 0.451))
t_data = np.array((0.398, 0.507))
y_data = np.array((0.63, 0.5))
xd = [L_data, t_data]
p0 = 0.003, 231
result = root(
    fun=err, x0=p0, method='lm',
    options={'maxiter': 10_000}
)
print(result.message)
if result.success:
    print('Guess:', model(xd, *p0))
    print('Fit:', model(xd, *result.x))

相关问题