You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多参数函数拟合修正:新增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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:20:33