多参数函数拟合修正:新增TC/C参数及绘图需求(附报错)
修正6参数磁化率拟合代码及绘图方案
问题根源
报错ValueError: operands could not be broadcast together with shapes (400,) (396,)是因为输入的温度(T)、磁化率(χ)、磁场强度(H)数组长度不匹配,拟合时无法逐元素计算。需先确保所有实验数据数组长度一致。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import least_squares from scipy.optimize import root_scalar # ---------------------- 1. 数据预处理 ---------------------- # 替换为你的实验数据,确保T、chi、H长度一致 T = np.array([...]) # 温度数据 chi = np.array([...]) # 磁化率数据 H = np.array([...]) # 磁场强度数据 # 强制对齐数据长度(截断至最短数组的长度) min_len = min(len(T), len(chi), len(H)) T = T[:min_len] chi = chi[:min_len] H = H[:min_len] # ---------------------- 2. 定义残差函数 ---------------------- # 残差 = 公式计算值 - 参数C,最小化残差平方和实现拟合 def residual(params, T, chi, H): a, b, c, d, TC, C = params term1 = a * (T - TC) * (chi ** (1/c)) term2 = b * (H ** (1/d)) * (chi ** (1/c + 1/d)) return term1 + term2 - C # ---------------------- 3. 设置初始参数 ---------------------- # 替换为你给定的初始值 initial_params = [1.0, 0.5, 2.0, 3.0, 100.0, 5.0] # [a, b, c, d, TC, C] # ---------------------- 4. 执行6参数拟合 ---------------------- result = least_squares(residual, initial_params, args=(T, chi, H)) fit_params = result.x a_fit, b_fit, c_fit, d_fit, TC_fit, C_fit = fit_params print("拟合得到的参数:") print(f"a = {a_fit:.4f}, b = {b_fit:.4f}, c = {c_fit:.4f}") print(f"d = {d_fit:.4f}, TC = {TC_fit:.4f}, C = {C_fit:.4f}") # ---------------------- 5. 数值求解拟合的磁化率值 ---------------------- # 对每个温度点,求解隐式方程得到拟合的χ值 def solve_chi(T_val, H_val, params): a, b, c, d, TC, C = params def func(chi): return a*(T_val - TC)*(chi**(1/c)) + b*(H_val**(1/d))*(chi**(1/c + 1/d)) - C chi_guess = np.mean(chi) # 用实验数据平均值作为初始猜测 sol = root_scalar(func, x0=chi_guess, method='newton') return sol.root chi_fit = np.array([solve_chi(T[i], H[i], fit_params) for i in range(len(T))]) # ---------------------- 6. 绘制实验数据与拟合曲线对比图 ---------------------- plt.figure(figsize=(10, 6)) # 实验数据散点 plt.scatter(T, chi, label='实验数据', color='blue', s=20) # 拟合曲线 plt.plot(T, chi_fit, label='拟合曲线', color='red', linewidth=2) plt.xlabel('温度 T (K)') plt.ylabel('磁化率 χ') plt.title('温度-磁化率实验数据与拟合曲线对比') plt.legend() plt.grid(alpha=0.3) plt.show()
关键修正说明
- 数据对齐:强制截断所有数据到最短数组长度,彻底解决形状不匹配问题
- 拟合方法适配:原公式为隐式方程,改用
least_squares替代传统curve_fit,更适合此类多参数隐式拟合场景 - 6参数完整支持:残差函数完整包含a、b、c、d、TC、C六个参数,完全匹配需求
额外提示
- 若实验在恒定磁场下进行,可将H改为固定常数,简化代码逻辑
- 初始参数的选择直接影响拟合收敛性,需确保初始值接近真实物理值
- 若拟合不收敛,可通过
least_squares的bounds参数给参数添加物理合理的边界约束
内容的提问来源于stack exchange,提问作者Cansu
相关产品推荐
相关产品推荐

