如何在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
相关产品推荐
相关产品推荐

