![](/img/trans.png)
[英]How to write a multi-conditional nonlinear piecewise function as the objective function in Pyomo?
[英]Conditional Piecewise Function
通过提供到目前为止的尝试,然后再提供我的意图和意见,可能会更容易解释这一点。
import numpy as np
from numpy import sqrt, arcsin, arcsinh
# Returns roots of quadratic (or lack of)
def roots(a, b, c):
b24ac = b*b - 4*a*c
if a == 0 or b24ac < 0:
return np.nan, np.nan
else:
l = (-b - sqrt(b24ac))/(2*a)
r = (-b + sqrt(b24ac))/(2*a)
if l > r:
l, r = r, l
return l, r
# Some numeric functions
def pw1(z, a, b, c):
return -arcsin((2*a*z+b)/sqrt(b*b - 4*a*c))/sqrt(-a)
def pw2(z, a, b, c):
return arcsinh((2*a*z+b)/sqrt(4*a*c - b*b))/sqrt(a)
# Function incorporating above definitions w/ conditions/domains
def func(z, a, b, c):
b24ac = b*b - 4*a*c
l, r = roots(*abc)
conditions = [(b24ac > 0 and a < 0) and (l < z and z < r),
(b24ac < 0 and a > 0)]
choices = [pw1(z, a, b, c),
pw2(z, a, b, c)]
return np.select(conditions, choices)
这是我尝试创建作为条件分段函数的python函数。 出于数学上的好奇,这是$ [ax ^ 2 + bx + c] ^ {-1/2} $积分的完整定义的一部分。 必要的细节是我需要一个以域和其他参数为条件的函数。 我研究了numpy的piecewise
和select
函数。 对于其条件列表, Piecewise
仅接受域上的逻辑(不接受参数)。 除非我缺少任何东西,否则这似乎对我不起作用。 Select
给了我最大的成功。 我唯一遇到的问题是它没有评估其域的域条件:
---> conditions = [(b24ac > 0 and a < 0) and (l < z and z < r),
(b24ac < 0 and a > 0)]
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
最后,它评估所有选择(与piecewise
提供的功能相对的结果),然后从条件列表中选择要返回的一个(注释出and (l < z
...条件):
c:\program files\python36\lib\site-packages\ipykernel_launcher.py:6:
RuntimeWarning: invalid value encountered in sqrt
我本周前开始使用一堆elif
语句。 这仅适用于浮点数,不适用于数组。 我正在使用numpy,然后在域上使用此函数(或任何其他函数)求值。 然后,我从numpy了解了piecewise
和select
并开始使用它们。
我真的很想用Python的方式来做到这一点。 一个仅对所需条件/域求值的numpy数组。 因此,表现得像piecewise
但具有通用条件,如select
。 任何帮助和建议,我们将不胜感激! 谢谢。
b24ac
标识符肯定是描述性的,但是大多数人可能会认为它是有discriminant
。
您在抱怨自己知道如何计算所需的结果,但是手头的numpy工具似乎不合适。 因此,编写您自己的函数fn
并使用.apply(fn)
或nditer 。 注意,您可以安排所有需要的参数出现在额外的列中,并使该函数一次处理一行。
我没有听说过关于速度的问题,这是反对这种自定义函数的通常论点。
我同意您的观点, 逐段()似乎适合您的需求。 似乎缺少的方面是在将其分段传递之前,使用四个参数对函数进行了定制。 满足此需求的理想选择是functools.partial() 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.