我有一个明确是两个变量函数的函数 - 但实际上,一个变量总是设置为常量。对于我的函数的非常简化版本,请考虑
def twovarfunc(x,z):
return (x**2) - 2 - z
其中,如果我想绘制此函数的图形,它将始终为func(x=np.linspace(),z=const)
形式。事实上,我实际上并不关心这个函数是什么样的 - 我只需要在给定z的值(或实际值,一系列值)时找到此函数的x-zero。
我已经取得了成功,例如:
from scipy import optimize as opt
def onevarfunc(x):
return x**2 - 4
opt.bisect(onevarfunc,0,5)
返回非常接近2的小数:1.9999999999998863
我的问题是我不理解告诉Python我需要在解决第一个变量的根时指定函数的第二个参数的常量值所需的语法。不幸的是,我没有发现SciPy文档对此有帮助。
我已尝试使用optimize.minimize
,optimize.root
,optimize.fsolve
等模块找到正确的语法,但我无法得到它。
我对Python(以及一般的OOP)非常陌生 - 我之前的经验是MATLAB,Igor Pro和Mathematica。有可能(很可能?)有一个我没有看到的非常简单的解决方案。
对于这里倾向于物理学的人,我试图找到一个函数的变分解,其中twovarfunc(x,z)
是关于x的导数。
答案 0 :(得分:3)
我认为您正在寻找的是部分应用的功能;它是一种获取功能并将一些参数粘贴到一个新功能中的方法。您可以使用内置的functools
模块执行此操作。如果你有这样的功能:
def func(x, z):
return x ** 2 - 2 * z
然后你可以部分应用它来创建一个只使用functools.partial
只接受一个参数的新函数:
partial_func = functools.partial(func, z=8)
现在partial_func
是一个新函数,只接受一个参数,当你用该参数设置它时,它等同于调用原始函数,z
设置为{{1 }};这两者都是等价的:
8
因此,对于您的代码,您可以这样做:
res = partial_func(20)
res = func(20, 8)
这会在onevarfunc = functools.partial(twovarfunc, z=20)
opt.bisect(onevarfunc,0,5)
中找到零x
为20。
答案 1 :(得分:0)
如果z是常数,只需将其视为常量。 x**2 - 2 - z
变为x**2 - (2 - z)
,其中2 - z
是常量,所以只需解决它。
回应评论时的澄清:
def twovarfunc(x, z):
return x**2 - 2 - z
def solve_twovarfunc(z, low, high):
# Find root between low and high for some value of z
def onevarfunc(x):
return twovarfunc(x, z)
return opt.bisect(onevarfunc, low, high)
基本上我们根据x
的某个常量值在z
中定义一个新的单变量函数,然后找到它的根。