24小时热门版块排行榜    

查看: 771  |  回复: 5

tutuzhu2013

银虫 (小有名气)

[求助] Matlab中如何把常量传递给lsqcurvefit,悬赏100金币 已有1人参与

function F = myfun(x,xdata)
F=fd.*exp(-xdata.*Dn)+(1-fd).*sqrt(pi./2).*x(1).*exp(xdata.*0.5.*(-2.*(Dn+x(2))+xdata.*x(1).^2)).*erfc((xdata.*x(1).^2 - x(2))./(sqrt(2).*x(1)))./(sqrt(pi./2).*x(1).*(1 + erf(x(2)./(sqrt(2).*x(1)))));

fd,Dn是需要传递的常量
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

512095518

专家顾问 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
感谢参与,应助指数 +1
tutuzhu2013: 金币+100, ★★★很有帮助 2015-12-02 15:42:10
参数传递有两种方法,全局变量和匿名函数。

这里我建议你用全局变量,比较简单

首先你要在你这个函数文件中设置全局变量,
function F = myfun(x,xdata)
global fd Dn
F=fd.*exp(-xdata.*Dn)+(1-fd).*sqrt(pi./2).*x(1).*exp(xdata.*0.5.*(-2.*(Dn+x(2))+xdata.*x(1).^2)).*erfc((xdata.*x(1).^2 - x(2))./(sqrt(2).*x(1)))./(sqrt(pi./2).*x(1).*(1 + erf(x(2)./(sqrt(2).*x(1)))));

然后你在你做拟合的m文件中,也加上定义全局变量
就是直接把global fd Dn加到你文件的第一行就可以了

这样在调用你的myfun函数时,系统会自动把fd和Dn的值赋给你的myfun函数
没有极限,只有超越!
2楼2015-12-02 13:33:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tutuzhu2013

银虫 (小有名气)

引用回帖:
2楼: Originally posted by 512095518 at 2015-12-02 13:33:31
参数传递有两种方法,全局变量和匿名函数。

这里我建议你用全局变量,比较简单

首先你要在你这个函数文件中设置全局变量,
function F = myfun(x,xdata)
global fd Dn
F=fd.*exp(-xdata.*Dn)+(1-fd).*sqrt ...

谢谢,弄好的。顺便能不能再问个问题,如何在有low and upper boundary的情况下使用levenberg-marquardt算法?
3楼2015-12-02 15:43:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

512095518

专家顾问 (正式写手)

引用回帖:
3楼: Originally posted by tutuzhu2013 at 2015-12-02 15:43:39
谢谢,弄好的。顺便能不能再问个问题,如何在有low and upper boundary的情况下使用levenberg-marquardt算法?...

抱歉,没有用过你这个优化算法。如果我想到了,再给你留言
没有极限,只有超越!
4楼2015-12-02 16:39:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

512095518

专家顾问 (正式写手)

引用回帖:
3楼: Originally posted by tutuzhu2013 at 2015-12-02 15:43:39
谢谢,弄好的。顺便能不能再问个问题,如何在有low and upper boundary的情况下使用levenberg-marquardt算法?...

刚刚看了下,应该是这样的
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
lb是下边界,ub是上边界,options是优化选项,可以直接选择LM算法
我给你举个例子

xdata = linspace(0,3);
ydata = exp(-1.3*xdata) + 0.05*randn(size(xdata));
lb = [0,-2];
ub = [3/4,-1];
fun = @(x,xdata)x(1)*exp(x(2)*xdata);
x0 = [1/2,-2];
opts = optimset('Algorithm','Levenberg-Marquardt');
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,opts);
plot(xdata,ydata,'ko',xdata,fun(x,xdata),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')
没有极限,只有超越!
5楼2015-12-02 16:53:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tutuzhu2013

银虫 (小有名气)

引用回帖:
5楼: Originally posted by 512095518 at 2015-12-02 16:53:17
刚刚看了下,应该是这样的
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
lb是下边界,ub是上边界,options是优化选项,可以直接选择LM算法
我给你举个例子

xdata = linspace(0,3);
ydata = exp(-1.3 ...

LM算法中,不接受boundary的吧。前面试过差不多的,都提醒不行的、
6楼2015-12-02 19:26:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 tutuzhu2013 的主题更新
信息提示
请填处理意见