我从未使用过优化工具,但我认为我现在必须使用,所以我有点迷失了方向。使用@A给出的答案后。Donda,我注意到这可能不是最好的解决方案,因为每次我运行函数时,它都会给出不同的矩阵"pares",而且在大多数情况下,它会说我需要更多的评估。所以我想,也许我的问题的答案是遗传算法优化,但我又一次不知道如何使用它们。
我的第一个问题描述如下,答案由@A给出。唐达是唯一一个有答案的人。我真的需要完成这个优化,我不知道如何使用GA工具处理这个案例。
再次提前感谢你,谢谢你@A。唐达,谢谢你的回答。
按照要求,我试图将我试图解释的代码放在这里,我希望它会产生以下结果:
function opt_pares
clear all; clc; close all;
h = randi(24,8760,1);
nd = randi(365,8760,1);
veic = randi(333,8760,1);
max_veic = max(veic);
veicN = veic./max_veic;
Gh = randi(500,8760,1);
Dh = randi(500,8760,1);
Ih = Gh-Dh;
A = randi([300 800], 27,1);
max_Gh = max(Gh);
max_Dh = max(Dh);
max_Ih = max(Ih);
lat = 70;
HRA =15.*(h-12);
decl = 23.27*sind(360*(284+nd)/365);
Ii = zeros(8760,27);
Di = zeros(8760,27);
Gi = zeros(8760,27);
pares = randi([0,90],27,2);
inclin = pares(:,1);
azim = pares(:,2);
% for MATRIZC
for n=1:27
Ii(:,n) = Ih.*(sind(decl).*sind(lat).*cosd(inclin(n))-sind(decl).*cosd(lat).*sind(inclin(n)).*cosd(azim(n))+cosd(decl).*cosd(lat).*cosd(inclin(n)).*cosd(HRA)+cosd(decl).*sind(lat).*sind(inclin(n)).*cosd(azim(n)).*cosd(HRA)+cosd(decl).*sind(inclin(n)).*sind(azim(n)).*sind(HRA));
Di(:,n) = 0.5*Dh.*(1+cosd(inclin(n)));
Gi(:,n) = (Ii(:,n)+Di(:,n))*A(n,1);
end
Gparque = sum(Gi,2);
max_Gparque = max(Gparque);
GparqueN = Gparque./max_Gparque;
RMSE = sqrt(mean((GparqueN-veicN).^2));
% end
end
我不知道这是否可能,也许这一次我可以更加自信。
我的主要目标是实现尽可能好的RMSE,为此我必须创建一个矩阵("ares"),其中每行包含一对值(每列一个值)。
这些值必须在一定范围内(0-90)。对于这27对中的每一对,我必须计算"Ii"/"Gi"/"Di",得到一个大小为8760*27的矩阵。
然后我对"Gi"求和,得到"Gparque"(向量8760*1),最后计算"RMSE"。当我计算RMSE时,我必须将矩阵"pares"修改为其他值,以获得更好的RMSE。一旦有27个值的许多组合可以在0-90范围内,我必须找到一个解决方案,可以优化搜索,以获得最小RMSE。
代码中注释中的部分(带有"pares"的for循环)是我不知道如何做的事情,因为我必须更改"pares"的值,但有一些优化标准可以近似RMSE的最小值。
我希望这次我能更好地解释这个疑问。
非常感谢!
好的,下面是一个问题的尝试。我不确定结果最终会有多有用,因为我不了解潜在的问题,也没有真正的数据来测试它。
你需要一个优化算法,这是对的,你的问题似乎比简单的线性代数更复杂。为了进行优化,我使用了优化工具箱中的函数fminsearch
。
首先,需要定义其值要优化的函数(目标函数)。根据您的代码,这是
function RMSE = fun(pares)
inclin = pares(:,1);
azim = pares(:,2);
Ii = zeros(8760,27);
Di = zeros(8760,27);
Gi = zeros(8760,27);
for n=1:27
Ii(:,n) = Ih.*(sind(decl).*sind(lat).*cosd(inclin(n))-sind(decl).*cosd(lat).*sind(inclin(n)).*cosd(azim(n))+cosd(decl).*cosd(lat).*cosd(inclin(n)).*cosd(HRA)+cosd(decl).*sind(lat).*sind(inclin(n)).*cosd(azim(n)).*cosd(HRA)+cosd(decl).*sind(inclin(n)).*sind(azim(n)).*sind(HRA));
Di(:,n) = 0.5*Dh.*(1+cosd(inclin(n)));
Gi(:,n) = (Ii(:,n)+Di(:,n))*A(n,1);
end
Gparque = sum(Gi,2);
max_Gparque = max(Gparque);
GparqueN = Gparque./max_Gparque;
RMSE = sqrt(mean((GparqueN-veicN).^2));
end
现在我们可以调用
pares_opt = fminsearch(@fun, randi([0,90],27,2))
使用随机初始化。优化需要相当长的时间,因为目标函数没有非常有效地实现。这里有一个矢量化的版本,它做同样的事情:
% precompute
cHRA = cosd(HRA);
sHRA = sind(HRA);
sdecl = sind(decl);
cdecl = cosd(decl);
slat = sind(lat);
clat = cosd(lat);
function RMSE = fun(pares)
% precompute
cinclin = cosd(pares(:,1))';
sinclin = sind(pares(:,1))';
cazim = cosd(pares(:,2))';
sazim = sind(pares(:,2))';
Ii = bsxfun(@times, Ih, ...
sdecl * (slat * cinclin - clat * sinclin .* cazim) ...
+ (cdecl .* cHRA) * (clat * cinclin + slat * sinclin .* cazim) ...
+ (cdecl .* sHRA) * (sinclin .* sazim));
Di = 0.5 * Dh * (1 + cinclin);
Gi = (Ii + Di) * diag(A);
Gparque = sum(Gi,2);
max_Gparque = max(Gparque);
GparqueN = Gparque./max_Gparque;
RMSE = sqrt(mean((GparqueN-veicN).^2));
end
我们还没有实现pares
位于[0,90]内的约束。一种粗略的方法是插入以下行:
if any(pares(:) < 0) || any(pares(:) > 90)
RMSE = inf;
return
end
在目标函数的开头。
综合起来:
function Raquel
h = randi(24,8760,1);
nd = randi(365,8760,1);
veic = randi(333,8760,1);
max_veic = max(veic);
veicN = veic./max_veic;
Gh = randi(500,8760,1);
Dh = randi(500,8760,1);
Ih = Gh-Dh;
A = randi([300 800], 27,1);
lat = 70;
HRA =15.*(h-12);
decl = 23.27*sind(360*(284+nd)/365);
% precompute
cHRA = cosd(HRA);
sHRA = sind(HRA);
sdecl = sind(decl);
cdecl = cosd(decl);
slat = sind(lat);
clat = cosd(lat);
pares_opt = fminsearch(@fun, randi([0,90],27,2))
function RMSE = fun(pares)
if any(pares(:) < 0) || any(pares(:) > 90)
RMSE = inf;
return
end
% precompute
cinclin = cosd(pares(:,1))';
sinclin = sind(pares(:,1))';
cazim = cosd(pares(:,2))';
sazim = sind(pares(:,2))';
Ii = bsxfun(@times, Ih, ...
sdecl * (slat * cinclin - clat * sinclin .* cazim) ...
+ (cdecl .* cHRA) * (clat * cinclin + slat * sinclin .* cazim) ...
+ (cdecl .* sHRA) * (sinclin .* sazim));
Di = 0.5 * Dh * (1 + cinclin);
Gi = (Ii + Di) * diag(A);
Gparque = sum(Gi,2);
max_Gparque = max(Gparque);
GparqueN = Gparque./max_Gparque;
RMSE = sqrt(mean((GparqueN-veicN).^2));
end
end
对于模拟数据,如果我在相同的随机化数据上运行两次优化,但初始值不同,我会得到不同的解决方案。这表明目标函数存在一个以上的局部极小值。希望真实数据不会出现这种情况。