python - 如何取负数的任意幂
问题描述
当尝试将负数(例如np.sin(5)
)提高到小于 1 的任意幂次方(例如1/3
)时,即使使用 也会导致错误np.power
。但是为什么会这样,如何避免输出真实答案(例如-0.9861162244048773
)?
import numpy as np
np.sin(5)
#Out: -0.9589242746631385
(np.sin(5))**(3)
#Out: -0.881765166036633
(np.sin(5))**(1/3)
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
np.power(np.sin(5),3)
#Out: -0.881765166036633
np.power(np.sin(5),1/3)
__main__:1: RuntimeWarning: invalid value encountered in power
#Out: nan
#The correct answer sought to (np.sin(5))**(1/3) is -0.9861162244048773
-0.9861162244048773*-0.9861162244048773*-0.9861162244048773 == np.sin(5)
#Out: True
解决方案
如果您遵守算术规则,则不允许计算负数的幂,除非幂是整数(这里不需要,因为您说power < 1
)或者您扩展有效数字的范围以包括复数数字 或者你可以取它的立方根(正如权力1/3
所暗示的那样)。
使用复数,您可以使用任何 numpy 方法计算任何数字的幂:
np.sin(5 + 0j)**(1/3)
(np.sin(5) + 0j)**(1/3)
np.power(np.sin(5) + 0j, 1/3)
都会输出正确答案:
# Out: (0.4930581122024387+0.8540017014186199j)
对于立方根,您需要坚持使用特定的立方根方法:
np.cbrt(np.sin(5))
# Out: -0.9861162244048773
对于你的幂是分数的特殊情况,其中分子是偶正数,fi power=2/3
:
(np.sin(5)**2)**(1/3)
推荐阅读
- ios - 离子卡在 iPhone 中滚动缓慢
- php - 删除 symfony 路由组件中的默认语言环境前缀
- azure-devops - 如何在 Azure DevOps 中通过电子邮件发送管道工件?
- java - findElementByAccessibilityid 未在 Eclipse 智能感知中显示
- r - 如何安装包 MVTNORM
- apache-kafka - kafka jdbc sink连接器:创建或更新一个连接器时重新创建所有其他连接器
- lisp - 使用 Lisp 在循环中检查偶数和奇数
- php - 将文件附加到客户端中的 json 并在 php 中获取 api 服务器
- node-red - 更改访问本地html页面的方式
- java - 构建主项目时如何运行子模块插件目标?