我正在尝试通过多个点来拟合一个三次多项式。如果不限制导数,这可能是一个非常简单的问题。我发现使用CVXPY结合最小二乘和约束的有希望的解决方案,但到目前为止我甚至无法用CVXPY解决最小二乘问题。我还在Computational Science上发布了此问题,但考虑到它更多的是关于代码,Stack Overflow可能更加适合。以下是代码。
所有这些的结果是 a = 831.67009518; b = 1.17905623; c = 0.00155167 和 d = 2.2071452e-06。这给出了中等结果 y_est = [967.29960654 1147.20547453 1384.63057033 1692.81776513 2085.00993011]。考虑到它应该能够产生完美的解决方案,提供的解决方案对我来说并不令人满意。 一旦这个工作正常,我应该能够添加以下约束条件。
import cvxpy as cp
import numpy as np
# Problem data
x = np.array([100, 200, 300, 400, 500])
y = 2160 - 1.678571429 * x + 0.006785714 * x * x + 5.52692E-20 * x * x * x
print(x)
print(y)
# Constructing the problem
a = cp.Variable(1)
b = cp.Variable(1)
c = cp.Variable(1)
d = cp.Variable(1)
objective = cp.Minimize(cp.sum_squares(a + b * x + c * x * x + d * x * x * x - y))
prob = cp.Problem(objective)
# The optimal objective value is returned by `prob.solve()`.
result = prob.solve(solver=cp.SCS, eps=1e-5)
# The optimal value for x is stored in `x.value`.
print("a: ", a.value)
print("b: ", b.value)
print("c: ", c.value)
print("d: ", d.value)
print(a.value + b.value * x + c.value * x * x + d.value * x * x * x)
所有这些的结果是 a = 831.67009518; b = 1.17905623; c = 0.00155167 和 d = 2.2071452e-06。这给出了中等结果 y_est = [967.29960654 1147.20547453 1384.63057033 1692.81776513 2085.00993011]。考虑到它应该能够产生完美的解决方案,提供的解决方案对我来说并不令人满意。 一旦这个工作正常,我应该能够添加以下约束条件。
# add constraint for derivative = 0 in x = 500
constraints = [b + 2 * c * 500 + 3 * d * 500 * 500 == 0]
prob = cp.Problem(objective, constraints)
我并没有局限于CVXPY,所以欢迎提供其他的解决方案。