/* ltank.cc クラス Element_for_test の実装 */ #include <stdio.h> #include <time.h> #include "p_tmp.h" #include "ltank.h" // クラス Ltank のメンバ関数の実装. void Ltank::Save_terminal_state(FILE* fp) { if (fp != NULL) { fprintf(fp, "%ld %lf", current_time, s); } } double Ltank::Get_mean_data(void) { double sum = 0., ys; time_t t = current_time, te = current_time + time_step, ts; // sum: 時刻 current_time から時刻 t までのデータの積分値 // te: current_time + time_step // ts: 時刻 // ys: 時刻 ts でのデータ値 void** data_pack_array; int number_of_data_packs, ip; // current_time 以後の最初のデータパックを探します。 rp.Get_data_pack_array(data_pack_array, number_of_data_packs); for (ip = 0; ip < number_of_data_packs; ip++) { ts = ((Data<double>*) data_pack_array[ip])->Data_time(); if (ts > current_time) { ys = ((Data<double>*) data_pack_array[ip])->Value(); break; } } // te 以前の折れ線部分の積分値を加算します。 while (ts < te) { sum += 0.5 * (y + ys) * (ts - t); t = ts; y = ys; ip++; ts = ((Data<double>*) data_pack_array[ip])->Data_time(); ys = ((Data<double>*) data_pack_array[ip])->Value(); } // te までの残りのブロックの積分値を加算します。 ys = (y*(ts - te) + ys*(te - t))/(ts - t); sum += 0.5 * (y + ys) * (te - t); // y を更新します。 y = ys; return (sum/time_step); } Boolean Ltank::Calculate(void) { // # Ltank::Calculate(void) (define) time_t t0 = current_time; double imean = Get_mean_data(); s = c1 * s + c2 * imean; // 状態量を更新 double data = alpha * s; sp0.Send_data(Next_time(), data); // データの送信 data = beta * s; sp1.Send_data(Next_time(), data); // データの送信 return YES; } /* end of file */