我有以下测试程序。我的查询是两个折叠的:(1)一些解决方案如何给出零和(2)在变量上使用这种x2= np.where(x > y, 1, x)
条件是否合适? Scipy中是否有任何约束优化程序?
a = 13.235
b = 70.678
def system(X, a,b):
x=X[0]
y=X[1]
x2= np.where(x > y, 1, x)
f=np.zeros(3)
f[0] = 2*x2 - y - a
f[1] = 3*x2 + 2*y- b
return (X)
func= lambda X: system(X, a, b)
guess=[5,5]
sol = optimize.root(func,guess)
print(sol)
编辑:(2a)这里有x2= np.where(x > y, 1, x)
条件,两个方程式成为一个方程式。
(2b)另一个变化要求是:x2= np.where(x > y, x^2, x^3)
。我也要对这两点发表评论。谢谢!
答案 0 :(得分:1)
首先,您的system
功能是一种身份,因为您return X
而不是return f
。返回应该与X
的形状相同,所以你最好有
f = np.array([2*x2 - y - a, 3*x2 + 2*y- b])
接下来,所写的函数具有不连续性,其中x = y,这导致(5,5)的初始猜测存在问题。将初始猜测设置为(5,6)可以快速找到解决方案[13.87828571,14.52157143]。
对于第二个例子,再次使用[5,5]的初始猜测导致不连续性问题,使用[5,6]给出了[2.40313743,14.52157143]的解决方案。
这是我的代码:
import numpy as np
from scipy import optimize
def system(X, a=13.235, b=70.678):
x = np.where(X[0] > X[1], X[0]**2, X[0]**3)
y=X[1]
return np.array( [2*x - y - a, 3*x + 2*y - b])
guess = [5,6]
sol = optimize.root(system, guess)
print(sol)