私は最適化ツールを使ったことがありませんが、今は使わなければならないと思うので、少し迷っています。@Aによって与えられた答えを使用した後。Donda、関数を実行するたびに異なる行列「ペア」が返され、ほとんどの場合、さらに評価が必要であると言われるため、これが最善の解決策ではないことに気づきました。ですから、私の問題の答えは遺伝的アルゴリズムの最適化かもしれないと思っていましたが、もう一度、それらをどのように扱うかがわかりません。
私の最初の問題は以下に説明されており、その答えは@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」を達成することです。そのためには、各行に値のペア(各列から1つの値)が含まれるマトリックス(「ペア」)を作成する必要があります。
これらの値は、特定の範囲(0〜90)内にある必要があります。この27ペアのそれぞれで、「Ii」/「Gi」/「Di」を計算する必要があり、8760 * 27のようなサイズの行列が得られます。
次に、「Gi」の合計を作成して「Gparque」(ベクトル8760 * 1)にし、最後にIIで「RMSE」を計算します。RMSEを計算したら、マトリックスの「ペア」を他の値に変更する必要があります。これにより、RMSEが向上します。0〜90の範囲内にある27の値の組み合わせが多数あると、最小RMSEのこの検索を最適化できるソリューションを取得する必要があります。
コード内のコメントにある部分(「pares」を含むforループ)は、「pares」の値を変更する必要があるため、方法がわからないものですが、 RMSEの最小値。
今回は、この疑問をよりよく説明できたと思います。
どうもありがとうございました!
さて、これが質問の試みです。根本的な問題を理解しておらず、それをテストするための実際のデータがないため、結果が最終的にどれほど役立つかはわかりません。
最適化アルゴリズムが必要なのは正しかったです。問題は単純な線形代数よりも複雑に見えます。最適化にはfminsearch
、OptmizationToolboxの関数を使用します。
まず、値を最適化する関数(目的関数)を定義する必要があります。あなたのコードに基づいて、これは
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
シミュレートされたデータを使用して、同じランダム化データで初期値が異なる場合に最適化を2回実行すると、異なる解が得られます。これは、目的関数の極小値が複数あることを示しています。うまくいけば、これは実際のデータには当てはまりません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加