我有对数正态的等式:
y = 1 /(3.14 * x * sig)* exp( - (log(x)-mu)^ 2 /(2 * sig ^ 2))
和固定
y = a
x = b
我需要找到mu和sig的值。我可以在Matlab中设置mu,如:
mu = [0 1 1.1 1.2 ...]
并找到所有值对应的sig值,但我不能用solve或subs来表示。有什么想法吗???
谢谢!
答案 0 :(得分:1)
以下是使用fzero
以数字方式搜索sigma(x,y,mu)
函数的概念验证。
假设您已修复x,y
,则可以设置
mu = 1; %or whatever
myfun = @(sig) y-1./(3.14*x*sig).*exp(-(log(x)-mu)^2./(2*sig.^2)); %x,y,mu from workspace
sigma = fzero(myfun,1);
这将解决等式
y-1/(3.14*x*sig)*exp(-(log(x)-mu)^2/(2*sig^2))==0
sig
从sig==1
开始并将其返回sigma
。
您可以对其进行概括以获得mu
:
myfun2 = @(mu,sig) y-1./(3.14*x*sig).*exp(-(log(x)-mu).^2./(2*sig.^2));
sigmafun=@(mu) fzero(@(sig)myfun2(mu,sig),1);
然后sigmafun
会为您输入的sigma
的每个值提供mu
。假设参数x
和y
在第一个匿名函数声明之前设置。
或者你可以 reaaally 一般,并定义
myfun3 = @(x,y,mu,sig) y-1./(3.14*x*sig).*exp(-(log(x)-mu).^2./(2*sig.^2));
sigmafun2 = @(x,y,mu) fzero(@(sig)myfun3(x,y,mu,sig),1);
这里的主要区别在于x
和y
每次都会被输入sigmafun2
的函数,因此它们可以更改。在早期的情况下,x
和y
的值在定义时在匿名函数中被修复,即当我们发布myfun = @(sig)...
时。根据您的需求,您可以找到您想要使用的内容。
作为概念证明,我没有检查它对实际问题的表现如何。你肯定应该初步了解你期望的参数类型,因为很多情况下没有解决方案,fzero
会返回NaN
。
Oliver Amundsen的更新:sig(mu)
生成的x=100, y=0.001
函数如下所示: