-1

我在 Stackoverflow 上找到了以下答案:

https://stackoverflow.com/a/356187/1829329

但它仅适用于 n 根中的 n 整数:

import gmpy2 as gmpy

result = gmpy.root((1/0.213), 31.5).real
print('result:', result)

结果是:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-eb4628226deb> in <module>()
      8 
----> 9 result = gmpy.root((1/0.213), 31.5).real
     10 
     11 print('result:', result)

TypeError: root() requires 'mpfr','int' arguments

计算这样一个根的好方法是什么?(这是一些公式的python代码表示,我需要在讲座中使用它来计算。)

编辑#1

这是我的解决方案,基于http://math.stackexchange.comSpektre上人们的回答和信息。

import numpy as np

def naive_root(nth, a, datatype=np.float128):
    """This function can only calculate the nth root, if the operand a is positive."""
    logarithm = np.log2(a, dtype=datatype)
    exponent = np.multiply(np.divide(1, nth, dtype=datatype), logarithm, dtype=datatype)
    result = np.exp2(exponent, dtype=datatype)
    return result

def nth_root(nth, a, datatype=np.float128):
    if a == 0:
        print('operand is zero')
        return 0
    elif a > 0:
        print('a > 0')
        return naive_root(nth, a, datatype=datatype)
    elif a < 0:
        if a % 2 == 1:
            print('a is odd')
            return -naive_root(nth, np.abs(a))
        else:
            print('a is even')
            return naive_root(nth, np.abs(a))
4

3 回答 3

1

负指数平方的幂

无论如何,因为我没有在 python 或 gmpy 中编码,所以这里首先有一些定义:

  • pow(x,y)意味着xy
  • root(x,y)表示x-th 根y

由于这些是反函数,我们可以重写:

  • pow(root(x,y),x)=y

方程

您可以使用它来检查正确性。由于函数是逆函数,你也可以这样写:

  • pow(x,1/y)=root(y,x)
  • root(1/x,y)=pow(y,x)

因此,如果您获得分数(有理)根或幂,则可以将其计算为具有反函数的整数对应物。

此外,如果你得到类似的东西,root(2/3,5)那么你需要先将整数操作数分开:

root(2/3,5)=pow(root(2,5),3)
 ~11.18034 = ~2.236068   ^3
 ~11.18034 = ~11.18034

对于非理性的根源和权力,您无法获得精确的结果。相反,您将根或幂四舍五入到最接近的可能表示,以尽量减少错误或使用pow(x,y) = exp2(y*log2(x))方法。如果您使用任何浮点数或定点十进制数,那么您可以忘记精确pow(x,y) = exp2(y*log2(x))的结果并从头开始......

[笔记]

我假设只有正操作数......如果你得到负数的幂或根,那么你需要处理整数根和幂(奇/偶)的符号。因为非理性的根源和权力没有任何意义(或者至少我们还没有理解)。

于 2015-12-11T12:14:39.073 回答
1

如果您愿意使用 Python 3.x,那么pow()只需使用root(x,y) = pow(x,1/y). 如果合适的话,它会自动返回一个复杂的结果。

Python 3.4.3 (default, Sep 27 2015, 20:37:11)
[GCC 5.2.1 20150922] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> pow(1/0.213, 1/31.5)
1.0503191465568489
>>> pow(1/0.213, -1/31.5)
0.952091565004975
>>> pow(-1/0.213, -1/31.5)
(0.9473604081457588-0.09479770688958634j)
>>> pow(-1/0.213, 1/31.5)
(1.045099874779588+0.10457801566102139j)
>>>

返回复杂结果而不是引发 ValueError 是 Python 3 中的更改之一。如果您希望与 Python 2 具有相同的行为,则可以使用gmpy2和启用复杂结果。

>>> import gmpy2
>>> gmpy2.version()
'2.0.5'
>>> gmpy2.get_context().allow_complex=True
>>> pow(1/gmpy2.mpfr("0.213"), 1/gmpy2.mpfr("31.5"))
mpfr('1.0503191465568489')
>>> pow(-1/gmpy2.mpfr("0.213"), 1/gmpy2.mpfr("31.5"))
mpc('1.0450998747795881+0.1045780156610214j')
>>> pow(-1/gmpy2.mpfr("0.213"), -1/gmpy2.mpfr("31.5"))
mpc('0.94736040814575884-0.094797706889586358j')
>>> pow(1/gmpy2.mpfr("0.213"), -1/gmpy2.mpfr("31.5"))
mpfr('0.95209156500497505')
>>> 
于 2015-12-12T05:03:35.490 回答
1

这是我使用的东西,它似乎适用于任何数字:

root = number**(1/nthroot)
print(root)

它适用于任何数字数据类型。

于 2016-03-27T23:16:43.017 回答