我有一个模式、X 的最大值和最小值(Xmin
和 Xmax
),以及百分比置信度 (percentage
)。
我想使用以下函数来找到理论对数正态分布的 μ 和 σ:
累积分布函数:
和模式
我从以下 Matlab 脚本开始:
function [mu, sigma] = DefLog(Mode, Percentage, Xmin, Xmax)
syms s
eqn = 1/2+1/2*erf((log(Xmax)-(log(Mode)+s^2))/(sqrt(2)*s))-(1/2+1/2*erf((log(Xmin)-(log(Mode)+s^2))/(sqrt(2)*s)))==Percentage;
sigma = solve(eqn,s)
mu=log(Mode)+sigma^2
end
这为我提供了 mu 和 sigma 的单一数值解。
例如,如果我运行 DefLog(2, 0.95, 1, 4)
,我会得到 sigma = 0.33
和 mu = 0.80
我需要将这个等式转换为 Python,所以我使用 sympy
来求解相同的等式。我可以使用 sympy 获得单个数值解的唯一方法是使用 nsolve
函数。我的代码如下:
from sympy import *
def CalcScaleParamOPT(mode, percentage, Xmin, Xmax):
s = Symbol('s', Real=True)
eqn = (1/2+1/2*erf((log(Xmax)-(log(mode)+s**2))/(sqrt(2)*s))-(1/2+1/2*erf((log(Xmin)-(log(mode)+s**2))/(sqrt(2)*s)))) - 0.95
sigma = nsolve(eqn, 0.6)
mu=log(mode)+sigma**2
print(sigma)
print(mu.evalf())
CalcScaleParamOPT(2, 0.95, 1, 4)
这给出了与 matlab 脚本相同的解决方案,但不同于 matlab solve()
函数 nsolve()
需要一个足够接近我的答案的“猜测”寻找。 matlab 如何在没有猜测的情况下找到一个单一的解决方案?
最佳答案
基于documentation , MATLAB 的 solve
自动回退到数值解。假设它会自动生成一个猜测值(它没有提到如何),但它确实说你可以使用 vpasolve
手动传递一个猜测间隔,因为默认的 solve
只返回一个数值解(它找到的第一个)。
关于python - 为什么matlab中的solve()函数可以求解这个方程,而sympy中的nsolve()函数需要猜测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38058542/