python - 在 Python 中递归求解数学方程

标签 python math recursion

我想解一个方程,我应该递归地解它,我上传了公式图片(抱歉!我不知道如何在这里写数学公式!) enter image description here 我用Python编写的代码如下:

import math
alambda = 1.0
rho = 0.8
c = 1.0
b = rho * c / alambda
P0 = (1 - (alambda*b))
P1 = (1-(alambda*b))*(math.exp(alambda*b) - 1)

def a(n):
    a_n = math.exp(-alambda*b) * ((alambda*b)**n) / math.factorial(n)
    return a_n

def P(n):
    P(n) = (P0+P1)*a(n) + sigma(n)

def sigma(n):
    j = 2
    result = 0
    while j <= n+1:
        result = result + P(j)*a(n+1-j)
        j += 1
    return result

很明显我无法完成P功能。所以请帮我解决这个问题。 当n=1时我应该提取P2,当n=2时我应该提取P3。 顺便说一句,P0和P1如第6行和第7行所写。 当我调用 P(5) 时,我想在输出处看到 P(0)、P(1)、P(2)、P(3)、P(4)、P(5)、P(6)。

最佳答案

您需要重新组织公式,以便不必计算 P(3) 来计算 P(2)。这很容易做到,只需将求和的最后一项 P(n+1)a(0) 移至等式左侧并除以 a(0)。然后你就得到了用 P(m) 表示的 P(n+1) 公式,其中 m <= n,可以通过递归求解。

正如 Bruce 提到的,最好通过将 P(n) 的中间结果保存在字典中来缓存它们,这样 a) 您不必在每次需要时重新计算 P(2) 等,b) 之后你得到了 P(n) 的值,你可以打印字典来查看 P(m) 的所有值,其中 m <= n。

import math
a_lambda = 1.0
rho = 0.8
c = 1.0
b = rho * c / a_lambda
p0 = (1 - (a_lambda*b))
p1 = (1-(a_lambda*b))*(math.exp(a_lambda*b) - 1)
p_dict = {0: p0, 1: p1}

def a(n):
    return math.exp(-a_lambda*b) * ((a_lambda*b)**n) / math.factorial(n)

def get_nth_p(n, p_dict):
    # return pre-calculated value if p(n) is already known
    if n in p_dict:
        return p_dict[n]

    # Calculate p(n) using modified formula
    p_n = ((get_nth_p(n-1, p_dict)
            - (get_nth_p(0, p_dict) + get_nth_p(1, p_dict)) * a(n - 1)
            - sum(get_nth_p(j, p_dict) * a(n + 1 - j) for j in xrange(2, n)))
          / a(0))

    # Save computed value into the dict
    p_dict[n] = p_n
    return p_n

get_nth_p(6, p_dict)
print p_dict

编辑2

对代码进行一些修饰性更新 - 缩短名称并使 p_dict 成为 mutable default argument (我尝试谨慎使用的东西)确实使代码更具可读性:

import math

# Customary to distinguish variables that are unchanging by making them ALLCAP
A_LAMBDA = 1.0
RHO = 0.8
C = 1.0
B = RHO * C / A_LAMBDA
P0 = (1 - (A_LAMBDA*B))
P1 = (1-(A_LAMBDA*B))*(math.exp(A_LAMBDA*B) - 1)

p_value_cache = {0: P0, 1: P1}

def a(n):
    return math.exp(-A_LAMBDA*B) * ((A_LAMBDA*B)**n) / math.factorial(n)

def p(n, p_dict=p_value_cache):
    # return pre-calculated value if p(n) is already known
    if n in p_dict:
        return p_dict[n]

    # Calculate p(n) using modified formula
    p_n = ((p(n-1)
            - (p(0) + p(1)) * a(n - 1)
            - sum(p(j) * a(n + 1 - j) for j in xrange(2, n)))
          / a(0))

    # Save computed value into the dict
    p_dict[n] = p_n
    return p_n

p(6)
print p_value_cache

关于python - 在 Python 中递归求解数学方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28707922/

相关文章:

Python Pillow .ico 转换为 .gif

android - 如何在 EditText 上编写数学表达式?

来自 Eloquent Javascript 的 Javascript 递归

Scala 案例类和尾递归最佳实践

c - 递归添加目录大小的先前值

c# - 寻求澄清有关弱类型语言的明显矛盾

python - 从 google.cloud 导入 bigquery ModuleNotFoundError : No module named 'google'

python - 如何解释 conda 包冲突?

algorithm - 在 big-O 中使用 < 或 ≤

c++ - 一个数的最大除数与质因数的关系