半对数X轴下指数函数曲线拟合问题求助
半对数X轴指数拟合问题的解决方案
核心问题与修正点
- 数组创建语法错误:
np.array[]需改为np.array(),方括号是数组索引语法,圆括号才是创建NumPy数组的正确方式,该错误会导致数据读取异常或代码运行失败。 - 初始猜测严重偏离数据趋势:
你使用的a*np.exp(-c*x)+d函数形式是合理的(y随x增大呈指数衰减后趋近于常数d),但原初始值init_v = (1,1e-6,0)存在致命问题:c=1e-6过小,导致exp(-c*x)几乎恒等于1,拟合曲线会趋近于a+d,完全无法贴合数据的衰减趋势。
应基于数据估算初始值:观察数据可知,x趋近1时y趋近~0.15(即d≈0.15);x趋近0时y≈0.73(即a≈0.73-0.15=0.58);通过中间点计算得c≈15,修正后初始猜测为(0.6,15,0.15)。 - 绘图逻辑顺序错误:原代码先调用
plt.grid()再创建画布,会导致网格仅应用在默认画布,实际绘图的画布无网格;需先创建画布和轴对象,再设置网格、刻度等属性。 - 未正确调用显示函数:
plt.show是函数引用,必须加括号plt.show()才能显示图像。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit # 修正数组创建语法 kd = np.array([0.735420099, 0.700823723, 0.647775947,0.613179572,0.573970346,0.54398682,0.454036244,0.371004942,0.292586491,0.271828666,0.21878089,0.165733114,0.157660626,0.151894563]) ADAR = np.array([0.001012268,0.002028379,0.004015198,0.005931555,0.007948127,0.010143277,0.019594977,0.039746044,0.076782168,0.101639121,0.193968714,0.574178304,0.778822803,0.9878803]) def func(x,a,c,d): return a*np.exp(-c*x)+d # 基于数据趋势修正初始猜测 init_v = (0.6, 15, 0.15) opt, pcov = curve_fit(func, ADAR, kd, init_v) a, c, d = opt x2 = np.linspace(0.001, 1, 100) # 增加点数让拟合曲线更平滑 y2 = func(x2, a, c, d) # 调整绘图顺序,统一使用轴对象控制属性 fig, ax = plt.subplots() ax.grid(True, which="both") ax.scatter(ADAR, kd, c='blue', label='原始数据') ax.set_xscale('log') ax.set_xlim([0.001, 1]) ax.set_ylim([0, 0.8]) # 在图例中显示拟合参数 ax.plot(x2, y2, '-', label=f'拟合曲线: a={a:.2f}, c={c:.2f}, d={d:.2f}') ax.legend() ax.set_title('Area pressure coefficient') ax.set_xlabel('AD/AR') ax.set_ylabel('kd') plt.show()
内容的提问来源于stack exchange,提问作者Justincomp
相关产品推荐
相关产品推荐

