Guan_yiqiang 2024-11-27 21:06 采纳率: 42.9%
浏览 4

Python函数拟合

使用Python对指定函数的参数进行非线性拟合出现了拟合曲线和实验数据不匹配的问题
拟合的指定函数:

img

需要拟合的参数为:a,b,c,d,e,f,g
自变量为T,因变量为P
代码如下

#非线性拟合安托因方程的参数
import matplotlib.pyplot as plt
import numpy as np
import math
from scipy.optimize import curve_fit

T=np.array([253.15,258.15,263.15,268.15,273.15,278.15,283.15,288.15,293.15,298.15,303.15,308.15,313.15,318.15,323.15,328.15,333.15,338.15,343.15,348.15,353.15,358.15,363.15])
P=np.array([244.85886597,292.05483571,345.80875855,406.6663734,475.18552177,551.93585877,637.49900031,732.46915054,837.45425748,953.07775405,1079.98095651,1218.82621598,1370.30095533,1535.12278096,1714.04594957,1907.86961877,2117.44856446,2343.70750846,2587.66109165,2850.44342302,3133.355671,3437.9530431,3766.24034928])
P1=np.log(P)

def Ps(a,b,c,d,e,f,g,T):
    Ps=a+(b/(T+c))+d*T+e*np.log(T)+f*pow(T,g)
    return Ps
#使用curve_fit进行拟合
popt,pcov=curve_fit(Ps,T,P1,maxfev=80000)
#提取拟合参数
a_fit,b_fit,c_fit,d_fit,e_fit,f_fit,g_fit=popt
#根据拟合参数生成拟合曲线的T的值
T_fit=np.linspace(min(T),max(T),100)
#计算拟合曲线P的值
P_fit=Ps(a_fit,b_fit,c_fit,d_fit,e_fit,f_fit,g_fit,T_fit)

#绘制原始散点和拟合曲线
plt.figure(dpi=600)
plt.scatter(T,P1,label='Exp Data')
plt.plot(T_fit,P_fit,'r',label='Fit Data')
plt.legend()
plt.xlabel('T(K)')
plt.ylabel('P(KPa)')
plt.title('1,1-difluoroethane+PROPANE(293.15K),非线性回归')
plt.show()

拟合的曲线与数据点完全不匹配

img

并且出现了报错,我真的不知道是出现了什么问题

img

友友们有知道是怎么回事的吗

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这个问题似乎有两个主要问题。首先是你的拟合函数在某些地方计算产生了无效的数值(例如 log 函数在计算负值时会返回错误),然后是你的拟合曲线和实验数据不匹配的问题。让我们逐一解决这些问题。

    首先,对于无效数值的问题,我们需要确保在计算对数或任何可能导致无效数值的运算时,所有的输入都是有效的数值。在你的函数中,问题可能出在 np.log(T)pow(T, g) 上,如果 T 为负值或者零,那么 log 函数会返回错误。同时,如果 T 的值非常大(大于 float 类型能表示的最大值),也可能会产生问题。因此我们需要检查你的数据是否包含这些无效值。你可以使用以下代码来检查和处理无效值:

    invalid_T = np.where((T<=0) | np.isinf(T) | np.isnan(T))  # 检查无效的 T 值
    print("Invalid T values: ", T[invalid_T])  # 打印无效的 T 值
    

    对于拟合曲线和实验数据不匹配的问题,可能是由于你的函数模型并不适合你的数据,或者你的初始参数猜测不准确导致的。你可以尝试以下几种方法来解决这个问题:

    1. 检查你的数据是否适合这个模型。理解你的实验条件和数据获取方式可能会有助于你选择正确的模型。你的数据是否是服从这种物理规律(也就是你的函数模型代表的内容)?或者可能是数据获取或处理过程中存在问题。
    2. 如果你确信你的数据适合这个模型,但拟合结果仍然不准确,可能是因为你的初始参数猜测不准确。curve_fit 函数需要一些初始参数猜测来开始优化过程,如果这些猜测距离实际参数太远,可能会导致拟合失败。你可以尝试手动给出一些更合理的初始参数猜测。
    3. 在进行非线性拟合时,可能会遇到局部最小的问题,即优化过程可能被困在局部最小值处,而不是全局最小值处。这种情况下可以尝试改变优化算法或者增加迭代次数来寻找全局最优解。curve_fit 有一个 method 参数可以设置优化算法,比如 'trf' 或者 'dogbox' 可以用于非线性最小二乘问题。同时,增加 maxfev 的值也可以让优化过程进行更多的迭代。

    希望这些信息对你有所帮助!如果你还有其他问题,欢迎继续提问。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月27日