使用python返回求解变量

时间:2017-10-13 02:35:49

标签: python-3.x numerical-methods solver

我正在尝试编写一个函数来从python中的另一个函数返回求解变量,就像Excel解算器那样。

为了简化我的例子,我有一个函数接受几个变量然后计算一个价格。我将实际值(a,b,c,d,x)传递给此函数,因此它返回一个数值。

def calc_price(a,b,c,d,x):
    value = a+b*c-d + x
    return value

现在我给了一个目标价格,a,b,c,d。只有未知是变量x,所以我想回来解决变量x。我想把它构建成一个函数,它接受与calc_price相同的变量,并附加一个变量target_price。

def solve(target_price, a,b,c,d):
    #this function takes in values for target_price, a,b,c,d
    #and should do something like this:
    target_price = calc_price(a,b,c,d,x)
    solve for x   <---------this is the part I'm not sure how to do
    return x

我创建了一个如下所示的函数来通过循环来解决值x但是它在计算大数据集时效率很低,所以我正在寻找更有效的解决方案。

def solve(target_price,a,b,c,d):
    x = 0.01
    while x < 1:
        if abs(target_price - calc_price(a,b,c,d,x)) < 0.001:
             return x
        x += 0.001

谢谢!

1 个答案:

答案 0 :(得分:0)

考虑这个演示(因为你的任务对我来说仍然有点不清楚)并确保阅读scipy's docs以了解这些方法提供的基本保证。

有人可能会说,基于root-finding的方法更合适(我们在这里最小化函数;因此残余函数中的abs构造),但这种方法在这里不需要你给出一些包围间隔。

代码:

import numpy as np
from scipy.optimize import minimize_scalar
np.random.seed(0)

""" Utils """
def calc_price(x, a, b, c, d):
    value = a+b*c-d + x
    return value

def calc_price_res(x, target, a, b, c, d):
    value = a+b*c-d + x
    return abs(value - target)  # we are looking for f(x) == 0

""" Create fake-data (typically the job of OP!) """
a, b, c, d, x = np.random.random(size=5)
fake_target = calc_price(x, a, b, c, d)

print('a, b, c, d: ', a, b, c, d)
print('real x: ', x)
print('target: ', fake_target)
print('noisy obj (just to be sure): ', calc_price_res(x, fake_target, a, b, c, d))

""" Solve """
res = minimize_scalar(calc_price_res, args=(fake_target, a, b, c, d))

print('optimized x: ', res.x)
print('optimized fun: ', res.fun)

输出:

a, b, c, d:  0.548813503927 0.715189366372 0.602763376072 0.544883182997
real x:  0.423654799339
target:  0.858675077275
noisy obj (just to be sure):  0.0
optimized x:  0.423654796297
optimized fun:  3.04165614917e-09