1

こんにちは私は次のコード(ブルートフォース方式)で作業しています。「PV_supply」と「WT_supply」と「Demand」は48x1のサイズです。私がやろうとしているのは、48行のそれぞれの「Energy_battery」値を計算することです。ただし、これを行うには、各行の計算で前の行の「Energy_battery」の値を使用する必要があります。これは、コーディング方法がわからず、これに関するヘルプを期待していました。したがって、行1の「Energy_battery」の式は、式などに行1の「Energy_battery」値を使用します。

私のコードは次のとおりです。

for number_panels = 0:5

for number_turbines = 0:3


    for h=1:24 %# hours

        for d = 1:number_of_days %# which day

            n = h + 24*(d-1);

 Energy_battery(number_panels + 1, number_turbines + 1,1,1) = 100;

Energy_battery(number_panels + 1, number_turbines + 1,n+1,1) =...
Energy_battery(number_panels + 1, number_turbines + 1,h,1)  + ...
((PV_supply(n)*number_panels + WT_supply(n)*number_turbines) - ...   
Demand(n)/inverter_efficiency)*battery_charging_efficiency;
4

1 に答える 1

1

これは拡張コメントであり、あなたの質問の一部に対する回答にすぎませんが、他の最近の質問にも関連があると思います。

Matlabを配列処理言語と考えると便利です。計算の自然な「単位」は、他の多くの言語のようにスカラーではなく配列です。配列の要素を反復処理するためにループを作成していることに気付いた場合は、ループなしで同じ計算を表現するより「自然な」方法がある可能性があります。ループには絶対的な問題はありませんが、ループに過度に依存すると、2つの悪影響が生じる可能性があります。

  1. ループのないMatlabコードは、多くの場合、ループのある同等のコードよりも(はるかに)高速です。
  2. ループのあるコードは、多くの場合、ループのない同等のコードよりも雑然としており、使用する変数が多くなります。コードを理解することになると、混乱は邪魔になります

だから、例えば、あなたの声明

Energy_battery(number_panels + 1, number_turbines + 1,1,1) = 100;

ループネストから完全に持ち上げて、次のように書き直すことができます

Energy_battery(:,:,1,1) = 100;

さて、あなたのコードの大部分について、私がそれを正しく理解していれば、あなたはあなたが持っている他のベクトルの要素のEnergy_battery(:,:,n+1,1)値に基づいて各要素を更新したいと思うでしょう。まず、これを片付けましょうEnergy_battery(:,:,n,1)n

((PV_supply(n)*number_panels + WT_supply(n)*number_turbines) - Demand(n)/inverter_efficiency)*battery_charging_efficiency

次のように書き直すことができます

((PV_supply*number_panels + WT_supply*number_turbines) - Demand/inverter_efficiency)*battery_charging_efficiency

Matlabの場合、配列にスカラーを乗算すると、配列の各要素に乗算が適用されます。繰り返しになりますが、これには、などのインデックスの値をループする必要はありませんn

私は今行って仕事をしなければならないのではないかと心配しています。後で戻ってきて、誰もしなければレッスンを終えるでしょう。必要に応じて、この回答を自由に編集してください。

于 2012-07-17T13:52:11.810 に答える