为什么matlab中的solve()函数可以解决这个等式,而在sympy中的nsolve()函数需要猜测?

时间:2016-06-27 16:05:11

标签: 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来解决相同的等式。我可以使用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) 函数。我的代码如下:

solve()

这提供了与matlab脚本相同的解决方案,但与matlab nsolve()函数#include <iostream> using namespace std; int main() { string s = "Welcome"; string t="",k; cin>>t; k=s+t; cout<<k; return 0; } 不同,需要一个“猜测”足够接近我正在寻找的答案。 matlab如何在没有猜测的情况下找到单个解决方案?

1 个答案:

答案 0 :(得分:1)

基于documentation,MATLAB的solve会自动回退到数值解。假设它自动生成一个猜测值(它没有提到如何),但它确实说你可以使用vpasolve手动传递一个猜测间隔,因为默认的solve只返回一个数值解(它找到的第一个)。