- 积分
- 0
- 注册时间
- 2009-8-11
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2011-8-26 10:05:11
|
显示全部楼层
来自 湖南长沙
根据版主的提示,已经解决了。特意总结了相关解决方法供大家参考
fsolve、fzero、fmincon、fminbnd、nlinfit、lsqcurvefit等含参数问题
含参数非线性方程组求解方法总结
最近论坛每天都有人询问含参数非线性方程组求解问题,为了方便大家查询,在此对相关方法做一小结。
以fsolve求解方程组a*log(x1)+x2^2-5=0;exp(x1)+b*sin(x2)-10=0为例。
方法一:全局变量法
function glo
global a b
%主函数定义全局变量
a=3;
b=4;
x0=[1 1];
x=fsolve(@tes,x0)
function y=tes(x)
global a b
%子函数定义全局变量
y=[a*log(x(1))+x(2)^2-5;
exp(x(1))+b*sin(x(2))-10];
%以上存为glo.m
%在命令窗口输入
glo
%得到:
Optimization terminated: first-order optimality is less than options.TolFun.
x =
1.80833796874946 1.79520903756128
方法二:嵌套函数法
注:此方法在MATLAB7.0以上版本可用
function nesti
function y=tes(x)
%使用嵌套函数时,嵌套函数可以直接调用主函数变量
y=[a*log(x(1))+x(2)^2-5;
exp(x(1))+b*sin(x(2))-10];
end
%使用嵌套函数时,嵌套函数和主函数都必须用end表示函数结束
a=3;
b=4;
x0=[1 1];
x=fsolve(@tes,x0)
end
%以上存为nesti.m
%在命令窗口输入
nesti
%得到:
Optimization terminated: first-order optimality is less than options.TolFun.
x =
1.80833796874946 1.79520903756128
方法三:没有名字(推荐使用方法)
function unname
a=3;
b=4;
x0=[1 1];
x=fsolve(@tes,x0,[],a,b)
%[]表示fsolve的输入参数options采用默认值
function y=tes(x,a,b)
y=[a*log(x(1))+x(2)^2-5;
exp(x(1))+b*sin(x(2))-10];
%以上存为unname.m
%在命令窗口输入
unname
%得到:
Optimization terminated: first-order optimality is less than options.TolFun.
x =
1.80833796874946 1.79520903756128
4. 匿名函数法(Anonymous function)
适用于MATLAB7以及以后的版本
function withaddtionparas4
options = optimset('Display', 'off'); % Turn off Display
b =2; c = 3.5; x0 =0;
y = fsolve(@(x)mypoly(x,b,c), x0, options)
function y = mypoly(x,b,c)
y = x^3 + b*x + c;
这个方法不错
再总结一种方法,也适用于在GUI中参数传递,利用setappdata/getappdata函数。
function withaddtionpara7
data.b = 2;
data.c = 3.5;
x0 =0;
setappdata(0,'data',data);
options = optimset('Display', 'off'); % Turn off Display
y = fsolve(@poly, x0, options)
function y = poly(x) % Compute the polynomial.
data = getappdata(0,'data');
b = data.b;
c = data.c;
y = x^3 + b*x + c; |
评分
-
1
查看全部评分
-
|