博彩網(wǎng)站做代理賺錢嗎廣州市口碑seo推廣
一、概述
? ? ? ? 之前對這本書的第三章進行了代碼實現(xiàn),這篇博客是對這本書第4章相關(guān)代碼進行實現(xiàn),部分內(nèi)容安裝書中代碼無法實現(xiàn)相應(yīng)功能,MATLAB會報錯,對其進行一定程度的更改后,可以正常運行,與書中所給示例運行結(jié)果相一致。
二、具體實現(xiàn)
(一)使用函數(shù)
? ? ? ? 1.概述
????????因為書中幾個條件使用的示例函數(shù)均相同,在此將其單獨羅列出來,復(fù)制即可。
? ? ? ? 2.函數(shù)實現(xiàn)
? ? ? ? f_test1和其導(dǎo)數(shù)g_test1。
function y = f_test1(x)
%F_TEST1 此處顯示有關(guān)此函數(shù)的摘要
% 此處顯示詳細說明y = -3 * x * sin(0.75 * x) + exp(-2 * x);end
function y = g_test1(x)
%G_TEST1 此處顯示有關(guān)此函數(shù)的摘要
% 此處顯示詳細說明y = -2 / exp(2 * x) - 3 * sin(x * 0.75) - (3 * 0.75 * x * cos(0.75 * x));end
????????f_test2和其導(dǎo)數(shù)g_test2。
function y = f_test2(x)
%F_TEST2 此處顯示有關(guān)此函數(shù)的摘要
% 此處顯示詳細說明x1 = x(1);
x2 = x(2);
y = x1 ^ 2 + x2 ^ 2 - 1;end
function y = g_test2(x)
%G_TEST2 此處顯示有關(guān)此函數(shù)的摘要
% 此處顯示詳細說明x1 = x(1);
x2 = x(2);
y = 2 * x1 + 2 * x2;end
?????????f_test3和其導(dǎo)數(shù)g_test3。
function y = f_test3(x)
%F_TEST3 此處顯示有關(guān)此函數(shù)的摘要
% 此處顯示詳細說明y = sin(3 * x) / x;end
function y = g_test3(x)
%G_TEST3 此處顯示有關(guān)此函數(shù)的摘要
% 此處顯示詳細說明y = (3 * cos(3 * x)) / x - sin(3 * x) / ( x ^ 2);end
(二)Armijo_search條件
? ? ? ? 1.main.m文件
? ? ? ? 這個文件是此條件的主運行文件,放開相應(yīng)注釋即可運行每個示例。
% 這個文件主要為Armijo_search文件的主程序% 清空
close;
clear;
clc;% 第一個示例
% x_current = -2;
% d_current = 1;
% rho = 0.1;
% [alpha_acceptable, x_next, f_next, k] = Armijo_search(@f_test1, @g_test1, x_current, d_current, rho);% 第二個示例
% x_current = [2;2];
% d_current = [-1;-1];
% rho = 0.1;
% [alpha_acceptable, x_next, f_next, k] = Armijo_search(@f_test2, @g_test2, x_current, d_current, rho);% 第三個示例
x_current = 5;
d_current = 1;
rho = 0.5;
[alpha_acceptable, x_next, f_next, k] = Armijo_search(@f_test3, @g_test3, x_current, d_current, rho);
? ? ? ? 2.Armijo_search.m文件
? ? ? ? 此函數(shù)跟書中函數(shù)一樣,沒有太大改動。
function [alpha_acceptable, x_next, f_next, k] = Armijo_search(f_test, g_test, x_current, d_current, rho)
% f_test, 目標函數(shù)
% g_test, 目標函數(shù)對決策變量x的導(dǎo)數(shù)
% x_current, x在向量空間中的當(dāng)前點
% d_current, f_test在x_current的下降搜索方向
% rho, 可接受系數(shù)k_max = 1000;
k = 0;
f_current = f_test(x_current);
g_current = g_test(x_current);
f_alpha_lower_k = f_current;
g_alpha_lower_k = g_current;
df_alpha_lower_k = (d_current') * g_alpha_lower_k; % 這里這個值是一直保持不變的
f_alpha_lower_0 = f_alpha_lower_k;
df_alpha_lower_0 = df_alpha_lower_k;alpha_lower_k = 0;
alpha_upper_k = 1e8;
alpha_k = alpha_upper_k;%
for k = 1:k_maxx_alpha_k = x_current + alpha_k * d_current;f_alpha_k = f_test(x_alpha_k);Armijo_condition = f_alpha_k - f_alpha_lower_0 - rho * alpha_k * df_alpha_lower_0;if (Armijo_condition <= 0)alpha_acceptable = alpha_k;x_next = x_alpha_k;f_next = f_alpha_k;break;elseif (alpha_k < alpha_upper_k)alpha_upper_k = alpha_k;endalpha_k = alpha_lower_k + (1/2) * ((alpha_k ^ 2) * df_alpha_lower_k) / (f_alpha_lower_k - f_alpha_k + alpha_k * df_alpha_lower_k);% x_alpha_k = x_current + alpha_k * d_current;% g_alpha_lower_k = g_test(x_alpha_k);% df_alpha_lower_k = (d_current') * g_alpha_lower_k;end
endif(k == k_max)disp('Armijo inexact line search algorithm failed');alpha_acceptable = NaN;x_next = NaN;f_next = NaN;
endend
(三)Goldstein_search條件
? ? ? ? 1.main.m文件
????????這個文件是此條件的主運行文件,放開相應(yīng)注釋即可運行每個示例。
% 這個文件主要為Goldstein_search文件的主程序% 清空
close;
clear;
clc;% 第一個示例
% x_current = -2;
% d_current = 1;
% rho = 0.1;
% [alpha_acceptable, x_next, f_next, k] = Goldstein_search(@f_test1, @g_test1, x_current, d_current, rho);% 第二個示例
x_current = [2;2];
d_current = [-1;-1];
rho = 0.1;
[alpha_acceptable, x_next, f_next, k] = Goldstein_search(@f_test2, @g_test2, x_current, d_current, rho);% 第三個示例
% x_current = 5;
% d_current = 1;
% rho = 0.1;
% [alpha_acceptable, x_next, f_next, k] = Goldstein_search(@f_test3, @g_test3, x_current, d_current, rho);
? ? ? ? 2.Goldstein_search.m文件
? ? ? ? 此文件有些改動。
function [alpha_acceptable, x_next, f_next, k] = Goldstein_search(f_test, g_test, x_current, d_current, rho)
% f_test, 目標函數(shù)
% g_test, 目標函數(shù)對決策變量x的導(dǎo)數(shù)
% x_current, x在向量空間中的當(dāng)前點
% d_current, f_test在x_current的下降搜索方向
% rho, 可接受系數(shù)k_max = 1000;
k = 0;
f_current = f_test(x_current);
g_current = g_test(x_current);
f_alpha_lower_k = f_current;
g_alpha_lower_k = g_current;
df_alpha_lower_k = (d_current') * g_alpha_lower_k;
f_alpha_lower_0 = f_alpha_lower_k;
df_alpha_lower_0 = df_alpha_lower_k;tolerance = 1e-15;
if (abs(df_alpha_lower_k) > tolerance)alpha_initial = - 2 * f_alpha_lower_k ./ df_alpha_lower_k;
elsealpha_initial = 1;
end
alpha_lower_k = 0;
alpha_upper_k = 1e8;
alpha_k = alpha_initial; % 這個值是從初始值開始for k = 1:k_maxx_alpha_k = x_current + alpha_k .* d_current;f_alpha_k = f_test(x_alpha_k);g_alpha_k = g_test(x_alpha_k);df_alpha_k = (d_current') * g_alpha_k;Goldstein_condition1 = f_alpha_k - f_alpha_lower_0 - rho * alpha_k * (df_alpha_lower_0');Goldstein_condition2 = f_alpha_lower_0 + (1 - rho) * alpha_k * (df_alpha_lower_0') - f_alpha_k;if(Goldstein_condition1 <= 0)if(Goldstein_condition2 <= 0)alpha_acceptable = alpha_k;x_next = x_alpha_k;f_next = f_alpha_k;break;elsedelta_alpha_k = (alpha_k - alpha_lower_k) * df_alpha_k / (df_alpha_lower_k - df_alpha_k);if(delta_alpha_k <= 0)alpha_k_temp = 2 * alpha_k;elsealpha_k_temp = alpha_k + delta_alpha_k;endalpha_lower_k = alpha_k;f_alpha_lower_k = f_alpha_k;df_alpha_lower_k = df_alpha_k;alpha_k = alpha_k_temp;endelseif (alpha_k < alpha_upper_k)alpha_upper_k = alpha_k;endalpha_k_temp = alpha_lower_k + (1/2) * (((alpha_k - alpha_lower_k) ^ 2) * df_alpha_lower_k) / (f_alpha_lower_k - f_alpha_k + (alpha_k - alpha_lower_k) * df_alpha_lower_k);alpha_k = alpha_k_temp;endif(alpha_upper_k - alpha_lower_k < tolerance)alpha_acceptable = alpha_k;x_next = x_alpha_k;f_next = f_alpha_k;break;end
end
if((Goldstein_condition1 > 0)||(Goldstein_condition2 > 0))disp('Goldstein inexact line search algorithm failed');alpha_acceptable = NaN;x_next = NaN;f_next = NaN;
end
end
? ? ? ? 3.注意
? ? ? ? (1)第1方面? ? ? ??
這個文件改動的主要原因是因為,在運行第二個示例中,無法安裝成功運行,會出現(xiàn)數(shù)據(jù)維度不一樣的報錯。因為第二個示例所給的數(shù)據(jù)不再是單一變量,而是雙變量。
? ? ? ? 如圖所示,如圖中紅線劃出部分。這個部分在單一變量中不會出錯,但是在多變量中,因為向量沒有除法,所以會報錯。
? ? ? ? 將其改成如圖所示,即可消除報錯。
? ? ? ? (2)第二方面? ? ? ?
????????除此之外,還有一部分,如圖中紅線圈出,由于這兩個向量維度相同,都是2*1,所以無法直接相乘。
? ? ? ? 將其更改為如圖所示的部分,更改的思路是因為最后需要的是標量,需要將后面的維度為2*1的,進行轉(zhuǎn)置即可。
?(四)Wolfe_search條件
? ? ? ? 1.main.m文件
????????這個文件是此條件的主運行文件,放開相應(yīng)注釋即可運行每個示例。
% 這個文件主要為Wolfe_search文件的主程序% 清空
close;
clear;
clc;% 第一個示例
% x_current = -2;
% d_current = 1;
% rho = 0.1;
% sigma = 0.11;
% [alpha_acceptable, x_next, f_next, k] = Wolfe_search(@f_test1, @g_test1, x_current, d_current, rho, sigma);% 第二個示例
x_current = [2;2];
d_current = [-1;-1];
rho = 0.1;
sigma = 0.11;
[alpha_acceptable, x_next, f_next, k] = Wolfe_search(@f_test2, @g_test2, x_current, d_current, rho, sigma);% 第三個示例
% x_current = 5;
% d_current = 1;
% rho = 0.5;
% sigma = 0.11;
% [alpha_acceptable, x_next, f_next, k] = Wolfe_search(@f_test3, @g_test3, x_current, d_current, rho, sigma);
? ? ? ? 2.Wolfe_search.m文件
? ? ? ? 此文件的部分地方同樣也經(jīng)過更改,部分更改的思路與前面有一些相似之處。
function [alpha_acceptable, x_next, f_next, k] = Wolfe_search(f_test, g_test, x_current, d_current, rho, sigma)
% f_test, 目標函數(shù)
% g_test, 目標函數(shù)對決策變量x的導(dǎo)數(shù)
% x_current, x在向量空間中的當(dāng)前點
% d_current, f_test在x_current的下降搜索方向
% rho, 可接受系數(shù)
% sigma, 可接受點處的切線斜率大于初始點處切線斜率的倍數(shù),0<rho<sigma<1k_max = 1000;
k = 0;
f_current = f_test(x_current);
g_current = g_test(x_current);
f_alpha_lower_k = f_current;
g_alpha_lower_k = g_current;
df_alpha_lower_k = (d_current') * g_alpha_lower_k;
f_alpha_lower_0 = f_alpha_lower_k;
df_alpha_lower_0 = df_alpha_lower_k;tolerance = 1e-15;
if (abs(df_alpha_lower_k) > tolerance)alpha_initial = - 2 * f_alpha_lower_k ./ df_alpha_lower_k;
elsealpha_initial = 1;
end
alpha_lower_k = 0;
alpha_upper_k = 1e8;
alpha_k = alpha_initial; % 這個值是從初始值開始for k = 1:k_maxx_alpha_k = x_current + alpha_k .* d_current;f_alpha_k = f_test(x_alpha_k);g_alpha_k = g_test(x_alpha_k);df_alpha_k = (d_current') * g_alpha_k;Wolfe_condition1 = f_alpha_k - f_alpha_lower_0 - rho * alpha_k * (df_alpha_lower_0');Wolfe_condition2 = sum(sigma * df_alpha_lower_0 - df_alpha_k);if(Wolfe_condition1 <= 0)if(Wolfe_condition2 <= 0)alpha_acceptable = alpha_k;x_next = x_alpha_k;f_next = f_alpha_k;break;elsedelta_alpha_k = (alpha_k - alpha_lower_k) .* df_alpha_k ./ (df_alpha_lower_k - df_alpha_k);if(delta_alpha_k <= 0)alpha_k_temp = 2 * alpha_k;elsealpha_k_temp = alpha_k + delta_alpha_k;endalpha_lower_k = alpha_k;f_alpha_lower_k = f_alpha_k;df_alpha_lower_k = df_alpha_k;alpha_k = alpha_k_temp;endelseif (alpha_k < alpha_upper_k)alpha_upper_k = alpha_k;endalpha_k_temp = alpha_lower_k + (1/2) * (((alpha_k - alpha_lower_k) ^ 2) * df_alpha_lower_k) / (f_alpha_lower_k - f_alpha_k + (alpha_k - alpha_lower_k) * df_alpha_lower_k);alpha_k = alpha_k_temp;endif(alpha_upper_k - alpha_lower_k < tolerance)alpha_acceptable = alpha_k;x_next = x_alpha_k;f_next = f_alpha_k;break;end
end
if((Wolfe_condition1 > 0)||(Wolfe_condition2 > 0))disp('Wolfe inexact line search algorithm failed');alpha_acceptable = NaN;x_next = NaN;f_next = NaN;
end
end
? ? ? ? 3.注意
? ? ? ? (1)第1方面
? ? ? ? 與Goldstein條件相同的原因,需要將其修改為下面這樣,如圖所示。
? ? ? ? (2)第2方面
????????與Goldstein條件相同的原因,需要將其修改為下面這樣,如圖所示。原因還是因為維度問題。
? ? ? ? ?(3)第3方面
? ? ? ? 如書中源代碼所示,紅線劃出部分。這個Wolfe_condition2計算結(jié)果是2*1維的向量,不是一個標量,雖然在下面判斷Wolfe_condition2是否≤0時候沒有影響。
? ? ? ? 但其會影響到這個部分,最后的部分的判斷會報錯,如圖所示。
? ? ? ? ?根據(jù)對書中內(nèi)容的分析,此處應(yīng)該是個標量,而不應(yīng)該是個向量,如圖所示。
? ? ? ? ?使用sum將其每項相加即可。
(五)Strong_Wolfe_search條件
? ? ? ? ?1.main.m文件
????????這個文件是此條件的主運行文件,放開相應(yīng)注釋即可運行每個示例。
% 這個文件主要為Strong_Wolfe_search文件的主程序% 清空
close;
clear;
clc;% 第一個示例
x_current = -2;
d_current = 1;
rho = 0.1;
sigma = 0.11;
[alpha_acceptable, x_next, f_next, k] = Strong_Wolfe_search(@f_test1, @g_test1, x_current, d_current, rho, sigma);% 第二個示例
% x_current = [2;2];
% d_current = [-1;-1];
% rho = 0.1;
% sigma = 0.11;
% [alpha_acceptable, x_next, f_next, k] = Strong_Wolfe_search(@f_test2, @g_test2, x_current, d_current, rho, sigma);% 第三個示例
% x_current = 5;
% d_current = 1;
% rho = 0.1;
% sigma = 0.11;
% [alpha_acceptable, x_next, f_next, k] = Strong_Wolfe_search(@f_test3, @g_test3, x_current, d_current, rho, sigma);
? ? ? ? 2.Strong_Wolfe_search.m文件
? ? ? ? 此文件經(jīng)過部分更改。
function [alpha_acceptable, x_next, f_next, k] = Strong_Wolfe_search(f_test, g_test, x_current, d_current, rho, sigma)
% f_test, 目標函數(shù)
% g_test, 目標函數(shù)對決策變量x的導(dǎo)數(shù)
% x_current, x在向量空間中的當(dāng)前點
% d_current, f_test在x_current的下降搜索方向
% rho, 可接受系數(shù)
% sigma, 可接受點處的切線斜率大于初始點處切線斜率的倍數(shù),0<rho<sigma<1k_max = 1000;
k = 0;
f_current = f_test(x_current);
g_current = g_test(x_current);
f_alpha_lower_k = f_current;
g_alpha_lower_k = g_current;
df_alpha_lower_k = (d_current') * g_alpha_lower_k;
f_alpha_lower_0 = f_alpha_lower_k;
df_alpha_lower_0 = df_alpha_lower_k;tolerance = 1e-15;
if (abs(df_alpha_lower_k) > tolerance)alpha_initial = - 2 * f_alpha_lower_k ./ df_alpha_lower_k;
elsealpha_initial = 1;
end
alpha_lower_k = 0;
alpha_upper_k = 1e8;
alpha_k = alpha_initial; % 這個值是從初始值開始for k = 1:k_maxx_alpha_k = x_current + alpha_k .* d_current;f_alpha_k = f_test(x_alpha_k);g_alpha_k = g_test(x_alpha_k);df_alpha_k = (d_current') * g_alpha_k;Strong_Wolfe_condition1 = f_alpha_k - f_alpha_lower_0 - rho * alpha_k * (df_alpha_lower_0');Strong_Wolfe_condition2 = sum(sigma * df_alpha_lower_0 + abs(df_alpha_k));% Strong_Wolfe_condition2 = sum(abs(df_alpha_k) - abs(sigma * df_alpha_lower_0));if(Strong_Wolfe_condition1 <= 0)if(Strong_Wolfe_condition2 <= 0)alpha_acceptable = alpha_k;x_next = x_alpha_k;f_next = f_alpha_k;break;elsedelta_alpha_k = (alpha_k - alpha_lower_k) .* df_alpha_k ./ (df_alpha_lower_k - df_alpha_k);if(delta_alpha_k <= 0)alpha_k_temp = 2 * alpha_k;elsealpha_k_temp = alpha_k + delta_alpha_k;endalpha_lower_k = alpha_k;f_alpha_lower_k = f_alpha_k;df_alpha_lower_k = df_alpha_k;alpha_k = alpha_k_temp;endelseif (alpha_k < alpha_upper_k)alpha_upper_k = alpha_k;endalpha_k_temp = alpha_lower_k + (1/2) * (((alpha_k - alpha_lower_k) ^ 2) * df_alpha_lower_k) / (f_alpha_lower_k - f_alpha_k + (alpha_k - alpha_lower_k) * df_alpha_lower_k);alpha_k = alpha_k_temp;endif(alpha_upper_k - alpha_lower_k < tolerance)alpha_acceptable = alpha_k;x_next = x_alpha_k;f_next = f_alpha_k;break;end
end
if((Strong_Wolfe_condition1 > 0)||(Strong_Wolfe_condition2 > 0))disp('Wolfe inexact line search algorithm failed');alpha_acceptable = NaN;x_next = NaN;f_next = NaN;
end
end
? ? ? ? 3.注意
? ? ? ? (1)第1方面
? ? ? ? 跟前面類似,如圖所示。
? ? ? ? (2)第2方面
? ? ? ? 跟前面類似,如圖所示,這里將兩個問題合并。
? ? ? ? (3)第3方面
? ? ? ? 如圖所示,第二個判斷條件,可以換成注釋掉的那種,根據(jù)書中的條件,第二種寫法更加符合書中的條件,如圖所示。