求解两条曲线的缩放系数与偏移量(线性问题求解)
解决曲线缩放与偏移的拟合问题
先明确你代码里的核心问题:
- 目标函数逻辑错误:你用了残差的均值
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
相关产品推荐
相关产品推荐

