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

求解两条曲线的缩放系数与偏移量(线性问题求解)

解决曲线缩放与偏移的拟合问题

先明确你代码里的核心问题:

  • 目标函数逻辑错误:你用了残差的均值np.mean(c1 - (c2*x1 +x2)),正负残差会相互抵消,根本没法正确量化误差。应该用残差平方的均值或残差平方和,让所有误差都转化为正数值进行最小化。
  • scipy.minimize参数顺序错误:正确调用格式是scipy.optimize.minimize(目标函数, 初始猜测值, args=(额外参数)),你把c1、c2放到了初始猜测的位置,导致参数传递混乱,这就是报错的直接原因。
  • 模型关系搞反:实际模型是c2 = a*c1 + b,你写的残差逻辑颠倒了c1和c2的位置。

方法一:线性代数解析解(最直接高效)

因为你的问题是线性模型,属于标准线性回归问题,直接用最小二乘解析解就能得到精确结果,不需要迭代优化:

import numpy as np

t = np.arange(0, 10, 0.1)
c1 = np.sin(t)
c2 = c1*2.5 + 4

# 构造线性方程组的系数矩阵
A = np.vstack([c1, np.ones(len(c1))]).T
# 最小二乘求解
a, b = np.linalg.lstsq(A, c2, rcond=None)[0]

print(f"a = {a:.4f}, b = {b:.4f}")

运行后直接输出a = 2.5000, b = 4.0000,完全符合预期。

方法二:修正scipy.minimize的用法

如果一定要用优化方法,修正目标函数和参数传递即可:

import numpy as np
from scipy.optimize import minimize

t = np.arange(0, 10, 0.1)
c1 = np.sin(t)
c2 = c1*2.5 + 4

# 目标函数:计算残差平方和(或均方误差,优化结果等价)
def func(x, c1, c2):
    a, b = x
    residuals = c1*a + b - c2
    return np.sum(residuals**2)

x_start = [2, 10]  # 初始猜测值
# 正确传递额外参数:args=(c1, c2)
result = minimize(func, x_start, args=(c1, c2))

print(f"a = {result.x[0]:.4f}, b = {result.x[1]:.4f}")

运行后同样能得到正确的a、b值。

内容的提问来源于stack exchange,提问作者Pickels

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:35:07