我对Matlab完全陌生,我的代码一直有一些问题。
我需要使用"fsolve"来定位非线性优化问题的最小值,但我无法使其工作。我一直在使用mathworks的"非线性系统的求解过程"部分。
我的代码如下:
function F = myfun(x)
F = [4*x(4) + 2*x(1) - x(3)*(2*x(1) + 4) + 4*x(1)*(x(1).^2 + x(2) - 11) + 2*x(2).^2 - 14;
x(3) - 10*x(4) + 2*x(2) + 4*x(2)*(x(2).^2 + x(1) - 7) + 2*x(1).^2 - 22;
x(2) - (x(1) + 2).^2;
4*x(1) - 10*x(2);];
x0 = [-5;-5];
options = optimoptions('fsolve','Display','iter');
[x,fval] = fsolve(@myfun,x0,options);
end
它在哪里说;分配给x的值似乎也未使用;输入参数不足。但根据数学作品的页面,我和他们做了完全一样的事情,所以我现在有点迷路了。
有几件事你做得不对:
- 函数
myfun
必须仅包含方程式(如Florian的评论中所述) - 必须从单独的脚本或从命令窗口调用
fsolve
、x0
和options
- 初始点阵列
x0
必须具有至少与myfun
中的方程中存在的变量(x(4)
、x(3)
、x(2)
、x(1)
)一样多的元素
编辑函数myfun
,确保它只包含方程,并将其保存在工作目录中。
function F = myfun(x)
F = [4*x(4) + 2*x(1) - x(3)*(2*x(1) + 4) + 4*x(1)*(x(1)^2 + x(2) - 11) + 2*x(2)^2 - 14;
x(3) - 10*x(4) + 2*x(2) + 4*x(2)*(x(2)^2 + x(1) - 7) + 2*x(1)^2 - 22;
x(2) - (x(1) + 2)^2;
4*x(1) - 10*x(2)];
end
请注意,您不需要使用元素幂运算符.^
。使用^
运算符就足以在方程式中定义幂。
现在,在命令窗口中输入以下说明:
x0 = [-5;-5;-5;-5];
options = optimoptions('fsolve','Display','iter');
[x,fval] = fsolve(@myfun,x0,options);
请注意,我修改了x0
,使其至少有4个元素,以便与您在myfun
中定义的方程数量相匹配。这些只是示例值,因此应该使用问题的值修改x0
。
这是输出的一个片段:
Norm of First-order Trust-region
Iteration Func-count f(x) step optimality radius
0 5 81521 4.27e+04 1
1 10 12608.5 1 1.15e+04 1
2 15 966.243 2.5 1.71e+03 2.5
3 20 408.322 6.25 685 6.25
4 21 408.322 15.625 685 15.6
5 26 263.815 3.90625 244 3.91
6 27 263.815 9.76563 244 9.77
7 32 205.88 2.44141 272 2.44
8 37 138.11 6.10352 206 6.1
9 42 93.4561 6.10352 105 6.1
10 47 64.0129 6.10352 42.3 6.1
...