我是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的值似乎未使用;没有足够的输入参数。但是根据mathworks页面,我做了与他们完全相同的事情,所以我现在有点迷失了。
答案 0 :(得分:1)
有些事情你做得不对:
myfun
必须只包含公式(如Florian的comment中所述)。fsolve
,x0
和options
。x0
必须至少与方程中存在的变量(x(4)
,x(3)
,x(2)
,x(1)
)一样多。在myfun
。编辑您的函数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
...