Python中的优化问题-例如目标寻求

问题描述

我刚刚开始使用Python,但我遇到了一个挑战,我认为它应该很简单,但我似乎无法弄清楚。在Excel中,有一个“目标搜索”选项,您可以在其中通过更改另一个值来优化值。我想知道是否可以在Python中有效解决类似的优化问题,但是能够一次改变多个值。

一个最小的例子:

我有两个数组

x = np.array([2,3,5,6,2,2])
y = np.array([3,1,4,2])

我试图在y中找到将仅使用值[1、2、3] /

的以下公式的结果设置为5的值
np.sqrt(sum((x-y)**2))

我知道正确的值应该是:

[1,1]

我意识到可能有多种解决方案,因此能够对此设置一些约束是很好的。

是否有任何允许我执行此操作的软件包?上面只是一个玩具示例,在这种情况下,我可以尝试[1、2、3]的所有possilbe组合,但我确实在寻找可以扩展到更大数据集的东西。

解决方法

root之间的距离越来越近。但是无法弄清楚如何只选择1,2和3。

import numpy as np
import scipy.optimize as opt

x = np.array([2,3,5,6,2,2])
y = np.array([1,1,1])

def func(y):
    x = np.array([2,2])
    z = np.sqrt(np.sum((x-y)**2)) - 5
    return  np.zeros(x.shape[0],) + z

r = opt.root(func,x0=y,method='hybr')
print(r.x)
# array([1.51287563,2.93792864,2.41974376,1.82313836,1.49719936,1.36584456])

print(np.sqrt(np.sum((x-r.x)**2)))
# 5.0

这是一项工作进展。我必须弄清楚如何将其限制为1、2和3。当我取得突破时,我将更新我的答案。

更新

要使用任何给定的数组,

X = np.array([3,4,7])
y = np.array([1,1])

def func(y,given=X):

    z = np.sqrt(np.sum((given-y)**2)) - 5
    return  np.zeros(given.shape[0],method='hybr')
print(r.x)
# array([1.97522498 3.47287981 5.1943792  2.10120135 4.09593969])

print(np.sqrt(np.sum((X-r.x)**2)))
# 5.0
,

使用scipy.optimization软件包中的fsolve。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html

您应该这样定义6个参数:

# z = [ z1,z2,z3,z4,z5,z6]
z = x - y
roots = fsolve(func,z)
def func(z):
    return [np.sqrt(sum(z**2))-5,0]