我怎么能使用fmincon执行非线性约束优化的范围值非线性约束?

2视图(30天)
我试图最小化目标函数(投资组合风险)受到非线性约束(投资组合回报率)通过寻找最优资产组合内的股票。此刻我能够这样做对于一个给定水平的返回手动输入非线性contraint作为标量函数。然而,我想能够计算和存储最优资产股票在一系列的回报水平,而不必每次都手动更改他们的约束函数。
目标函数是:
函数f = objecfun (x);
p = csvread (“trialpolitical.csv”);
f = p”* (x。* x);
结束
非线性约束(手动输入利润水平的“g”0.0252):
函数测查[c] = nonlconstr (x)
c = [];
r = csvread (“trialreturns.csv”);
g = 0.0252;
测查= [g - ((35) * (x。* r)));
结束
文件我运行的优化:
清晰的所有
x0 = csvread (“x0.csv”);
r = csvread (“trialreturns.csv”);%资产回报
p = csvread (“trialpolitical.csv”);%资产的政治风险
m = csvread (“trialconstraints.csv”);%最大资产股份
选择= optimset;
%修改选项设置
选择= optimset(选项,“显示”,“关闭”);
选择= optimset(选项,“算法”,“内点”);
一个= [];
b = [];
Aeq = 1 (1、35);
说真的= 1;
1磅= 0(35岁);
乌兰巴托= m;
[x fval] = fmincon (Aeq @objecfun x0, A, b,说真的,磅,乌兰巴托,@nonlconstr);
任何帮助将是感谢!

答案(1)

马特·J
马特·J 2012年10月6日
编辑:马特·J 2012年10月6日
重写你的非线性约束。顺便说一下,这些约束我看起来很线性
函数测查[c] = nonlconstr (x, g, r)
c = [];
测查= [g - ((35) * (x。* r)));
结束
然后调用fmincon作为
我= 0;
g = range_of_g
我=我+ 1;
[x (i), fval(我))= fmincon (Aeq @objecfun x0, A, b,说真的,磅,乌兰巴托,@ (x) nonlconstr (x, r, g));
结束
除了当然最好是预先分配x (i)和fval(我)。
3评论
马特·J
马特·J 2023年4月29日
编辑:马特·J 2023年4月29日
@Frank 不可能连续的存储解决方案g OP说他想做的。金宝搏官方网站数字计算机只能存储有限数量的结果。然而,如果你想追求一个单一的解决方案x有效投资组合回报率的上界和下界,这将是微不足道的修改提出的代码:
函数测查[c] = nonlconstr (x,怒目而视,gUpper, r)
测查= [];
c(1) =[+怒视-(的(35)* (x。* r)));
c (2) = [-gUpper +(的(35)* (x。* r)));
结束
像2012年一样,不过,我仍然认为最好把这些写成线性约束,具体问题具体分析工作流将自动为我们现在所做的,
x = optimvar (“x”,35岁,“低”0,“上”,m);
y = (x。* r)总和;
Constraints.con_sum (x) =和< = 1;
Constraints.con_gLower = y > =怒目而视;
Constraints.con_gUpper = y < = gUppper;
索尔=解决(optimproblem (“目标”,x。”* (x。* p),“约束”、约束)

登录置评。

类别

找到更多的在开始使用优化工具箱帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!