2017-02-12 16 views
0

我對Matlab完全陌生,而且我的代碼出現了一些問題。在Matlab中使用'fsolve'在數值上查找最小化方法

我需要使用'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的值似乎未被使用以及;沒有足夠的輸入參數。但是,根據數學工作頁面,我完成了與他們完全相同的工作,所以我現在有點失落。

+1

功能'F = myfun(x)的'應該只包含了'F = [...]'一部分。它是一個函數,它接受一個向量'x'並返回成本函數的值。最後三行在調用fsolve之前定義了一個初始點x0和一些選項。這應該發生在函數之外。否則,該函數將自行調用。製作一個包含最後三行的腳本並查看它的功能。 – Florian

回答

1

有幾件事情,你是不是做正確:

  1. 功能myfun只能包含公式(如弗洛裏安之comment提到)。
  2. fsolvex0options必須從單獨的腳本或從命令窗口調用。
  3. 初始點陣列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有爲了匹配在myfun定義的方程式的數量至少4個元素。這些僅僅是示例值,所以您應該修改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 
    ...