matlab非线性规划fmincon函数中目标函数参数传递问题,急求!
fmincon函数的标准形式维[x,fval]=fmincon('fun',Bt0,[],[],[],[],lb,ub,@constr),然后fun是目标函数,Bt0为初...
fmincon函数的标准形式维[x,fval]=fmincon('fun',Bt0,[],[],[],[],lb,ub,@constr),然后fun是目标函数,Bt0为初值点,优化函数相当于讲Bt0带入fun,逐渐逼近求局部最优解。现在小弟遇到的情况是这样的,需要将fun中(fun是一个比较复杂的式子,需要用到循环,不能直接写出来,只能是写成M文件形式)的一个原来固定的参数设成是变量,并以这个变量为横坐标,以变量所对应的局部最优解为纵坐标画图,求问,怎样将变量(写在外层循环)实现传递?跪谢!!!!!!!
展开
2个回答
展开全部
使用匿名函数句柄就可以了
fmincon 需要的函数fun只有一个输入参数 fun(x)
而你的函数需要多一个能改变的变量 那么形式变成 myfun(p,x)
p就是你要传递的参数,x还是原来的输入
当然首先,你得写个m文件,假设为myfun.m,其内容大致如下
function [out]=myfun,(p,x)
...........
end
就是根据参数p和输入x,求的输出,当然名字可以自己取,然后就是主程序了
for p=p0:pn %参数p的取值
[x,fval]=fmincon(@(x) myfun(p,x),Bt0,[],[],[],[],lb,ub,@constr);
.......
end
其中关键就是@(x) myfun(p,x)
这会返回一个匿名的函数句柄,会使用当时的p值代入myfun
得到一个只有一个输入x的函数,这样就能把额外的参数传递给需要优化的函数
如果你的函数有等多的参数例如
myfun(a,b,c,x)
a=..
b=..
c=..
同样用@(x) myfun(a,b,c,x)把a,b,c参数的值传给要优化的函数
在以上的基础上,加几句,存储每次的参数p和对应的优化结果
然后画图就可以了
fmincon 需要的函数fun只有一个输入参数 fun(x)
而你的函数需要多一个能改变的变量 那么形式变成 myfun(p,x)
p就是你要传递的参数,x还是原来的输入
当然首先,你得写个m文件,假设为myfun.m,其内容大致如下
function [out]=myfun,(p,x)
...........
end
就是根据参数p和输入x,求的输出,当然名字可以自己取,然后就是主程序了
for p=p0:pn %参数p的取值
[x,fval]=fmincon(@(x) myfun(p,x),Bt0,[],[],[],[],lb,ub,@constr);
.......
end
其中关键就是@(x) myfun(p,x)
这会返回一个匿名的函数句柄,会使用当时的p值代入myfun
得到一个只有一个输入x的函数,这样就能把额外的参数传递给需要优化的函数
如果你的函数有等多的参数例如
myfun(a,b,c,x)
a=..
b=..
c=..
同样用@(x) myfun(a,b,c,x)把a,b,c参数的值传给要优化的函数
在以上的基础上,加几句,存储每次的参数p和对应的优化结果
然后画图就可以了
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
这种情况涉及到给目标函数传递附加参数的问题,一般有三种做法:
1、使用匿名函数。但既然你的函数比较复杂,这种方法应该不适用。
2、使用嵌套函数,也就是把目标函数写成主函数的一个嵌套函数,这样主函数里面随着循环变化的变量就可以直接在嵌套函数里面使用。推荐使用这种方法。
3、使用传递附加参数的方法。例如,把目标函数定义为
function y = objfun(x, p1, p2...)
调用fmincon的时候,用
fmincon(@objfun,x0,A,b,Ae,be,lb,ub,@nonlcon,opt,p1,p2...)
其中p1、p2即为要传递的参数,前面的各参数如果没有,可以写空矩阵([]),但不能缺,必须用来占位。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询