我有一个模式,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
来解决相同的等式。我可以使用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如何在没有猜测的情况下找到单个解决方案?
答案 0 :(得分:1)
基于documentation,MATLAB的solve
会自动回退到数值解。假设它自动生成一个猜测值(它没有提到如何),但它确实说你可以使用vpasolve
手动传递一个猜测间隔,因为默认的solve
只返回一个数值解(它找到的第一个)。