python - 为什么matlab中的solve()函数可以求解这个方程,而sympy中的nsolve()函数需要猜测?

标签 python matlab math sympy

我有一个模式、X 的最大值和最小值(XminXmax),以及百分比置信度 (percentage)。

我想使用以下函数来找到理论对数正态分布的 μ 和 σ:

累积分布函数:

CDF

和模式

mode

我从以下 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.33mu = 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/

相关文章:

algorithm - 如何计算实数的逆阶乘?

python - 为什么 0 ** 0 在 python 中等于 1

python:更新mysql表

python - 在列表中使用切片 numpy 对象

python - 导入 Cython 生成的 .so 文件时,这个 ImportError 是什么意思?

arrays - 在matlab中查找数组中遵循某个值的元素

c - double 取模

python - 为什么我会收到 ElementClickInterceptedException 错误?

arrays - 使用 mexCallMATLAB 时避免复制数组

Matlab 二维密度图