You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中求解离散方程?寻找EU=0.5对应的p值

问题

我定义了如下函数:

import numpy as np
p = np.arange(0,1,0.01)
EU = (((-(1.3+1-0.5)**(1.2-1.5)/(1-1.5)))**-1)*p + (((-(0.1+1-0.5)**(1.2-1.5)/(1-1.5)))**-1)*(1-p)

我希望求解得到使EU == 0.5的p值。经手动计算,该p值应为0.4244,但当前代码中p以0.01为步长离散取值,不存在能让EU精确等于0.5的p值。我可以接受获取使EU最接近0.5的p值,但担心代码无法找到结果,请问该如何解决?

解决方案

方法1:在现有离散数组中找到最接近的p值

直接利用numpy的数组运算就能快速定位目标,完全不用担心找不到结果:

import numpy as np

# 生成p数组并计算EU
p = np.arange(0, 1, 0.01)
term1 = (((-(1.3+1-0.5)**(1.2-1.5)/(1-1.5)))**-1)
term2 = (((-(0.1+1-0.5)**(1.2-1.5)/(1-1.5)))**-1)
EU = term1 * p + term2 * (1 - p)

# 找到与0.5差值最小的EU对应的p值
closest_idx = np.argmin(np.abs(EU - 0.5))
closest_p = p[closest_idx]
closest_EU = EU[closest_idx]

print(f"最接近的p值:{closest_p},对应的EU值:{closest_EU}")

这段代码通过np.abs(EU - 0.5)计算每个EU与目标值的绝对差,再用np.argmin定位差值最小的位置,直接得到对应p值。

方法2:求解精确的p值(推荐)

你的EU是关于p的线性函数,可以直接通过代数计算得到精确解,或者用数值工具获取更精准结果:

代数解法(直接计算)

先提取EU表达式中的常数项,再解方程:

# 计算常数项a和b
a = (((-(1.3+1-0.5)**(1.2-1.5)/(1-1.5)))**-1)
b = (((-(0.1+1-0.5)**(1.2-1.5)/(1-1.5)))**-1)

# 令EU=0.5,解p的表达式
target = 0.5
exact_p = (target - b) / (a - b)
print(f"精确p值:{exact_p:.4f}")  # 输出0.4244,与手动计算结果一致

数值解法(适配非线性场景)

如果后续遇到非线性EU函数,可用scipy的根求解工具:

from scipy.optimize import root_scalar

def eu_function(p):
    a = (((-(1.3+1-0.5)**(1.2-1.5)/(1-1.5)))**-1)
    b = (((-(0.1+1-0.5)**(1.2-1.5)/(1-1.5)))**-1)
    return a * p + b * (1 - p) - 0.5  # 目标是让该式等于0

result = root_scalar(eu_function, bracket=[0, 1], method='bisect')
print(f"数值求解的p值:{result.root:.4f}")

内容的提问来源于stack exchange,提问作者JoshBob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:01:19