查看: 505|回复: 4|关注: 1

[已解决] fmincon非线性最优化求解,未知数9个,非线性约束条件使用含未知数的矩阵相乘表达,但总是提示“输入参数的数目不足。”

[复制链接]

新手

11 麦片

财富积分


050


3

主题

12

帖子

0

最佳答案
程序很简单,长的只是数据太多,有个9*9的矩阵,还请各位大神帮帮忙

我最近刚刚使用matlab,想求解一个目标函数为线性,约束条件含有二次型的最优化问题,由于未知数较多,不方便直接输入函数表达式,于是用矩阵表达目标函数和二次型条件。

现在遇到的问题是不知道哪里写错了,跑程序时总会遇到fun2出错,“输入参数的数目不足”的问题,百度了相关问题,有说法是变量没有赋值,可我的目的就是求解未知数,不可能赋值呢;也试过用符号变量syms,把9个未知数改写成syms(1)……syms(9),可是提示依然是“输入参数的数目不足”。


请教各位大神,我该如何编写这个最优化程序呢?




fmincon主程序如下
[/code]
%求非线性最优化问题2(目标函数为线性方程,约束条件含一个二次型不等式)
clc
clear
X0=[0;0;0;0;0;0;0;0;0]
Aeq=[1 1 1 1 1 1 1 1 1]
Beq=[1]
lb=[0;0;0;0;0;0;0;0;0]
ub=[]
[x,fval]=fmincon(fun2,X0,[],[],Aeq,Beq,lb,ub,fun1)




fun2为线性目标函数
[/code]
function g=fun2(t) %目标函数是一个线性函数
A=[-0.2389 -4.5391 -2.4371 -3.5180 -0.6222 -0.9481 -7.2538 -16.1649 -1.6228]
X=[t(1);t(2);t(3);t(4);t(5);t(6);t(7);t(8);t(9)]
g=A*X

fun1为非线性二次型约束
[/code]
function f=fun1(t) %约束条件:非线性二次型函数
H=[0.0002 0.0093 0.0111 0.0109 0.0020 0.0022 -0.0055 0.0674 0.0012;...
    0.0093 0.8864 0.9088 0.9864 0.1398 0.2032 -0.8340 5.0206 0.0606;...
    0.0111 0.9088 1.0842 1.0521 0.1543 0.1949 -0.8053 6.1055 0.0946;...
    0.0109 0.9864 1.0521 1.1357 0.1639 0.2298 -0.9063 5.5951 0.0619;...
    0.0020 0.1398 0.1543 0.1639 0.0264 0.0351 -0.1128 0.8544 0.0109;...
    0.0022 0.2032 0.1949 0.2298 0.0351 0.0651 -0.1764 0.9968 0.0063;...
    -0.0055 -0.8340 -0.8053 -0.9063 -0.1128 -0.1764 0.9375 -4.2869 -0.0474;...
    0.0674 5.0206 6.1055 5.5951 0.8544 0.9968 -4.2869 37.7375 0.7239;...
    0.0012 0.0606 0.0946 0.0619 0.0109 0.0063 -0.0474 0.7239 0.0214]
X=[t(1);t(2);t(3);t(4);t(5);t(6);t(7);t(8);t(9)]
Y=X'
f=Y*H*X-0.0229

结果提示:
输入参数的数目不足。
出错 fun2 (line 3)
X=[t(1);t(2);t(3);t(4);t(5);t(6);t(7);t(8);t(9)]

新手

11 麦片

财富积分


050


3

主题

12

帖子

0

最佳答案
 楼主| 发表于 2019-12-13 15:56:34 | 显示全部楼层
真心求教大神们……

论坛优秀回答者

0

主题

672

帖子

123

最佳答案
  • 关注者: 26
发表于 2019-12-13 16:36:14 | 显示全部楼层 |此回复为最佳答案
试试
clc
clear

X0=[0;0;0;0;0;0;0;0;0];
Aeq=[1 1 1 1 1 1 1 1 1];
Beq=[1];
lb=[0;0;0;0;0;0;0;0;0];
ub=[];
H=[0.0002 0.0093 0.0111 0.0109 0.0020 0.0022 -0.0055 0.0674 0.0012;...
    0.0093 0.8864 0.9088 0.9864 0.1398 0.2032 -0.8340 5.0206 0.0606;...
    0.0111 0.9088 1.0842 1.0521 0.1543 0.1949 -0.8053 6.1055 0.0946;...
    0.0109 0.9864 1.0521 1.1357 0.1639 0.2298 -0.9063 5.5951 0.0619;...
    0.0020 0.1398 0.1543 0.1639 0.0264 0.0351 -0.1128 0.8544 0.0109;...
    0.0022 0.2032 0.1949 0.2298 0.0351 0.0651 -0.1764 0.9968 0.0063;...
    -0.0055 -0.8340 -0.8053 -0.9063 -0.1128 -0.1764 0.9375 -4.2869 -0.0474;...
    0.0674 5.0206 6.1055 5.5951 0.8544 0.9968 -4.2869 37.7375 0.7239;...
    0.0012 0.0606 0.0946 0.0619 0.0109 0.0063 -0.0474 0.7239 0.0214];
fun2=@(t)[-0.2389 -4.5391 -2.4371 -3.5180 -0.6222 -0.9481 -7.2538 -16.1649 -1.6228]*[t(1);t(2);t(3);t(4);t(5);t(6);t(7);t(8);t(9)];
c=@(t)[t(1);t(2);t(3);t(4);t(5);t(6);t(7);t(8);t(9)]'*H*[t(1);t(2);t(3);t(4);t(5);t(6);t(7);t(8);t(9)]-0.0229;
ceq=[];
fun1= @(x)deal(c(x),ceq);
[t,fval]=fmincon(fun2,X0,[],[],Aeq,Beq,lb,ub,fun1);
得到t
微信图片_20191213163449.png

新手

11 麦片

财富积分


050


3

主题

12

帖子

0

最佳答案
 楼主| 发表于 2019-12-13 23:34:16 | 显示全部楼层

感谢您的帮助,太感谢了,还想请问一个问题,我跑完程序后提示找到了局部最小值,但是就是没有输出t值,这又是为什么呢? matlab截图.png

新手

11 麦片

财富积分


050


3

主题

12

帖子

0

最佳答案
 楼主| 发表于 2019-12-14 00:32:27 | 显示全部楼层

我懂了,还要再打一个t,我是真白白。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表