【问题标题】:Use python to calculate a special limit使用python计算特殊限制
【发布时间】:2017-03-26 04:42:38
【问题描述】:

我要计算这个表达式:

(1 + 1 / math.inf) ** math.inf,

应该评估为e。但是 Python 返回 1。这是为什么呢?

=====更新========

我在这里要做的是从用户的输入中得出有效的年利率,APR(年百分比率)。

def get_EAR(APR, conversion_times_per_year = 1):
    return (1 + APR / conversion_times) ** conversion_times - 1

我希望这个表达式也适用于连续复利。是的,我知道我可以编写 if 语句来区分连续复利和正常情况(然后我可以直接使用常量 e),但我更喜欢集成方式。

【问题讨论】:

  • 限制的计算在python中没有实现,为此你可以使用sympy:sympy.org/en/index.html
  • 您可以使用 www.wolframalpha.com 进行计算
  • 您应该再次了解限制。这不像您直接替换该值。 ** math.inf 是什么意思?这在普通算术中没有意义。与1/01/math.inf 相同。它们必须使用限制来解决
  • 感谢您的意见!我刚刚更新了我的问题以澄清我的意图,并请建议我是否可以实现这一目标。 @eyllanesc
  • 我认为最好使用 if 语句。如果conversion_times 太大(尽管对于您的应用程序来说大得不切实际),您的浮点运算可能会开始出现舍入错误。

标签: python python-3.x math calculus


【解决方案1】:

默认情况下python没有实现限制的计算,为此你可以使用sympy

from sympy import *

x= symbols('x')
r = limit((1+1/x)**x, x, oo)
print(r)

输出:

E

【讨论】:

    【解决方案2】:

    因为您本质上是在执行两个单独的限制:

    lim x->infty ((lim y->infty (1 + 1/y))^x)
    

    哪个 Python 正确计算为 1。

    这是一个穷人对适当限制的实现:

    def euler(x):
        return (1+1/x)**x
    
    for i in range(10):
        print(euler(10**i))
    
    2.0
    2.5937424601000023
    2.7048138294215285
    2.7169239322355936
    2.7181459268249255
    2.7182682371922975
    2.7182804690957534
    2.7182816941320818
    2.7182817983473577
    2.7182820520115603
    

    【讨论】:

    • 感谢您的分步演示!这真的很有帮助。
    【解决方案3】:

    您可以在此处使用 mpmath (http://mpmath.org/) 包:

    >>> import mpmath as mp
    >>> f = lambda x: (1.0 + 1.0/x)**x
    >>> mp.limit(f, mp.inf)
    mpf('2.7182818284590451')
    

    【讨论】:

      【解决方案4】:

      我认为这里没有限制计算,因为这里没有变量可以在变量的不同值下计算整个语句。

      Python 只是以最简单的方式进行计算。 Pythons 编译器只是将1/math.inf 转换为0,然后将1 的math.inf 的幂计算为1

      【讨论】:

        【解决方案5】:

        Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32

        import sys
        import math
        
        
        E = sys.float_info.epsilon
        e = (1 + E) ** (1 / E)
        print(e, math.e, e == math.e)
        
        OUTPUT:
        2.718281828459045 2.718281828459045 True
        

        【讨论】:

          猜你喜欢
          • 2020-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-30
          • 2018-10-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多