簡體   English   中英

Matlab:非線性方程優化

[英]Matlab: Nonlinear equation Optimization

這個問題與下面的帖子有關:

Matlab:非線性方程求解器

使用8個變量x0-x8,我得到了不錯的結果。 但是,當我增加求解10個變量時,結果並不是很好。 即使我的“猜測”接近實際值並將最大迭代次數更改為100000,結果仍然很差。 我還能做些什么嗎?

這是代碼:

function F = fcn(x)
 F=[x(6) +          x(7)         + x(8)         + x(9)        + x(10)-2   ;
       x(6)*x(1)    +  x(7)*x(2)    + x(8)*x(3)    + x(9)*x(4)   + x(10)*x(5)          ;
       x(6)*x(1)^2  +  x(7)*x(2)^2  + x(8)*x(3)^2  + x(9)*x(4)^2 + x(10)*x(5)-2/3 ;
       x(6)*x(1)^3  +  x(7)*x(2)^3  + x(8)*x(3)^3  + x(9)*x(4)^3 + x(10)*x(5)          ;
       x(6)*x(1)^4  +  x(7)*x(2)^4  + x(8)*x(3)^4  + x(9)*x(4)^4 + x(10)*x(5)-2/5 ;
       x(6)*x(1)^5  +  x(7)*x(2)^5  + x(8)*x(3)^5  + x(9)*x(4)^5 + x(10)*x(5)          ;
       x(6)*x(1)^6  +  x(7)*x(2)^6  + x(8)*x(3)^6  + x(9)*x(4)^6 + x(10)*x(5)-2/7 ;
       x(6)*x(1)^7  +  x(7)*x(2)^7  + x(8)*x(3)^7  + x(9)*x(4)^7 + x(10)*x(5)          ;
       x(6)*x(1)^8  +  x(7)*x(2)^8  + x(8)*x(3)^8  + x(9)*x(4)^8 + x(10)*x(5)-2/9 ;
       x(6)*x(1)^9  +  x(7)*x(2)^9  + x(8)*x(3)^9  + x(9)*x(4)^9 + x(10)*x(5)          

       ];

 end

clc
clear all;
format long

x0 = [0.90; 0.53; 0; -0.53; -0.90; 0.23; 0.47; 0.56; 0.47; 0.23]; %Guess

F0 = fcn(x0);

[x,fval]=fsolve(@fcn, x0) %solve without optimization

options = optimset('MaxFunEvals',100000, 'MaxIter', 100000); %optimization criteria

[x,fval]=fsolve(@fcn, x0, options) %solve with optimization

這是我要獲取的實際值:

x1 = 0.906179
x2 = 0.538469
x3 = 0.000000
x4 = -0.53846
x5 = -0.906179
x6 = 0.236926
x7 = 0.478628
x8 = 0.568888
x9 = 0.478628
x10 = 0.236926 

諸如fsolve之類的優化功能的結果在很大程度上取決於初始點。 像您這樣的非線性函數可以具有很多局部最小值,您可以選擇將初始點隨機切成小方塊,並希望它將導致優化達到比以前更好的最小值。

您可以這樣:

clear;

options = optimset('MaxFunEvals',2000, 'MaxIter', 1000, 'Display', 'off');

n = 200; %how many times calculate f with different initial points
z_min = 10000; %the current minimum Euclidian distance between fval and zeros

for i=1:n
    x0 = rand(10, 1);

    [x,fval]=fsolve(@fcn, x0, options);

    z = norm(fval);

    if (z < z_min)
        z_min = z;
        x_best = x;
        f_best = fval;

        display(['i = ', num2str(i), '; z_min = ', num2str(z_min)]);
        display(['x = ', num2str(x_best')]);
        display(['f = ', num2str(f_best')]);

        fprintf('\n')
    end
end

更改優化循環的最大數量,然后查看z值。 它顯示了您的函數與零向量的接近程度。

到目前為止,最好的解決方案是:

x_best =

    0.9062
   -0.9062
   -0.5385
    0.5385
    0.0000
    0.2369
    0.2369
    0.4786
    0.4786
    0.5689

f_best =

   1.0e-08 *    %these are very small numbers :)

         0
    0.9722
    0.9170
    0.8740
    0.8416
    0.8183
    0.8025
    0.7929
    0.7883
    0.7878

對於此解決方案, z_min2.5382e-08

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM