概要
1、Feedback回路
高速逆ラプラス変換(FILT)を適用する主な領域は制御と微分方程式の解算出と考えられる。制御では、Feedback system の逆ラプラス変換が必要とされる。s
で記述されたシステム全体を、逆ラプラス変換FILT法で、
c++のSTL/vectorの特長を活かし、算出した。結果は良好である。
2、Euler変換
高速逆ラプラス変換(FILT)では、Euler変換を適用し、交代級数の収束を速めている。このEuler変換を62次まで、算出した。この算出結果を、順次に記載していく。全面改訂前のPageでは、紙面の横幅が狭く、折り返し部分が多く、非常に見にくい状態で、公開していたが、今回は、Footer部にコードを記載するので、すこしは見やすくなると考えている。また、前章の第5章に記載するのが、betterと思われるが、5章全体が非常に長くなるので、Feedback回路の章に記載する事とした。62次まで記載しようとすると、時間がかかるので、順次に記載する。現在57次まで
3、二項係数
Euler変換は、交代級数の項を無くすと、二項係数の集合となる。従い、二項係数だけを取り出し記載した。
1、Feedbackシステムの逆ラプラス変換
Feedback systemで、逆ラプラス変換を求めようとすると、前処理に数ステップを踏み、実際の計算を行う
事になる。この事情を以下に説明する。
図 1、Feedback 接続
ラプラス変換の記号 s で記述されたシステム P(s) と C(s) があり、C(s) が帰還回路側に設置されている
図 1の Feedback 接続では、伝達関数 y/u は、式 1 のように示される。
y/u = P(s) / ( 1 + P(s)・C(s) ) 式 1
式 1 は、分母に 1 を含んだ単純な式のように見えるが、システム P(s) と C(s) 自体が単純でないので、実際
のシステム全体のラプラスの記号 s で示される式は、さらに複雑になる。
例えば、
P(s) = ( s^2 + 0.5s + 17 ) / ( s^2 + 5s + 4)、
C(s) = (s^2 + 7s + 12 ) / ( s + 3 ) || 誤記訂正 s+4 を s+3 に訂正
の時、
y/u=(s^2+0.5s+17)/(s^2+5s+4)/(1+(s^2+0.5s+17)/(s^2+5s+4)*(s^2+7s+12)/(s+3)) 式
2
|| 誤記訂正 s+4 を s+3 に訂正
式 2 を、何回かの計算の後、式 3 のようにやっと整理できる。この式 3 の分母の解を算出し、部分分数に分
解して、教本に則し、部分分数の形により、逆変換行う。この計算もまた時間を要する。
y/u = ( s^2 + 0.5s + 17 ) / ( s^3 + 5.5s + 24s + 72 ) 式
3
また、下図の図 2 に示す直結 Feedback 接続の伝達関数 y/u は、式 4 で示される。
図 2、直結 Feedback 接続
y/u = P(s) C(s) / ( 1 + P(s)C(s) ) 式 4
この式 4 も、実際は複雑になる。
従い、システムの伝達関数求める際、前処理の計算を省き、P(s) と C(s) をそのままの形で逆ラプラス変換に
FILTで計算する事が必要となる。
2、合成積に対するFIlT(高速逆ラプラス変換)計算
1)合成積の計算
Feedback システムの数値計算には、式 1 に示すように合成積の計算が含まれている。合成積の計算につい
ては、一般に以下が成り立つ。
、
の時、
の逆変換は、
、
、
、
で計算する。
また、FILT計算は、以下の式に基づいている。(このHomepagenの数値計算3を参照方)
式 5
上記のFILTの式で、合成積の計算を行う場合は、ある n の時、以下の計算を行えばよい事になる。
式 6
式 6 は、P(s) と C(s) を同じnで算出し、複素数値である P(sn) と C(sn) の積をとり、結果の虚数部を求
めると、逆ラプラス変換値を得る事ができる事になる。
この考えは、P(sn)=a+jb、C(sn)=c+jd とした時、
imageF(s) = image { ( a + jb ) ( c + jd ) } = ad + bc 式 7
の計算を行えばよい事になる。2 項の計算の場合は、計算精度は問題ない。
これを、三項の積、P(sn)=a+jb、C(sn)=c+jd、G(sn)=e+jf に適用した場合、
imageF(s) =image { (a + jb ) ( c + jd ) ( e + jf ) } = acf + ade +
bce - bdf
となる。しかしながら、この三項の積の場合は、計算精度に問題が生じた。四項の積の場合は、もっと複雑にな
り、計算精度の低下が予想される。この要因に、P(sn)等を実数部と虚数部に分けて数回計算を行う事にあると
、考えて、最初から、システム全体の虚数部の前処理計算が不要に出来れば、精度が良くなると考えられる。
2)FILTでの合成積の計算と結果 (コード 1 )
予め、P(sn)、C(sn) 等のための積の枠を作り、それに sn の m 乗と係数 a[m] を代入して、最後に虚数
部を取り出す方法で計算を行った。
これで前記の式 2 の Feedback 回路について計算した結果を下図に示す。微妙な増減を計算しているので、
OKと言える。求値の y 値は、左側、解析解は右側で、両軸の差は 0.2 とし、両曲線が図示出来るようにした。
y/u=(s^2+0.5s+17)/(s^2+5s+4)/(1+(s^2+0.5s+17)/(s^2+5s+4)*(s^2+7s+12)/(s+3)) 式2
|| 誤記訂正 s+4 を s+3 に訂正
この式 2 の逆ラプラス変換の解析解( インパルス)は、以下である。
31/28exp(-4t)-3/28exp(-3/4t)cos(3/4sqrt(31)t)-73sqrt(31)/2604exp(-3/4t)sin(3/4sqrt(31)t)
また、式 2 は、解析解のy軸の増減を、この考えで作った逆ラプラス変換コードが計算出来るかどうかを確
認するために作成した式である。
更に、コードには、ステップ入力の場合の入力と解析解も記載している。この計算値と解析値を下図に
示す。ステップ応答でも本コードの計算は増減をよく示している。両者の差は、10-4 以下である。なお、
両曲線が判るように、両縦軸に 0.05 の差を設けた。
下図は、当然なる図であるので、Step入力にNoiseを加えた計算も下記に示す。
3) 合成積に Noise を加えた場合の計算と結果
上記の Step 入力に、振幅の小さな正弦波を加えた場合の計算を、周波数を変えて行う。いわゆる Noise
が加わった時である。
小さな振幅故に、上図の直線部には小さなさざ波が生じている図になると予想できる。
また、一般に、系の挙動を示す数式に、各項の係数が対象の周波数の係数と同程度であっても、それよ
り低周波の項や非常に周波数の高い項が生じた場合、それらの項を、系の挙動に影響を及ぼさないとして、
数式から除外する時がある。そのような考えを示す計算結果でもある。
計算は、 Step 入力( 1.0 )に 0.025・sin(a・t) を加える。ただし、 a= 0.2 , 2 , 20 , 200 (rad/s)
とする。
即ち、1/s + 0.025・0.2/(s2+0.22) , 1/s + 0.025・2/(s2+22) , 1/s + 0.025・20/(s2+202) ,,,
具体的には、
1/s + 0.025・0.2/(s2+0.22) = (0.22 + 0.025・0.2・s + s2)/(0 + 0.22・s + s3)
となるので、コード 1 の Step の個所
//Step 1/s の分子入力の設定
//a1[0]=1.0;// 1/sの 1 の入力
//b1[0]=0.0;b1[1]=1.0;// 1/(s+0.0)の0.0とsの係数1.0の入力
を変更し、以下で計算する。
・ a = 0.2 の時 sin(0.2t) を加えた時
//Step+0.025*sin(0.2t) =1/s+0.025*0.2/(s^2+0.2^2) の分子側入力の設定
上記の式の分数の和は、以下の式となる。
( 0.04 + 0.2*0.025*s + s^2 ) / ( 0.04*s + s^3 )
従い、分母側はコード 1 のままで分子側は以下となる。
a1[0]=0.04;a1[1]=0.2*0.025;a1[2]=1.0;
b1[0]=00000.0;b1[1]=0.04;b1[2]=0.0;b1[3]=1.0;
・ a = 2 の時 sin(2t) を加えた時
//Step+0.025*sin(2t) =1/s+0.025*2/(s^2+2^2) の分子側入力の設定
上記の式の分数の和は、以下の式となる。
( 4.0 + 2.0*0.025*s + s^2 ) / ( 4.0*s + s^3 )
従い、分母側はコード 1 のままで分子側は以下となる。
a1[0]=4.0;a1[1]=2.0*0.025;a1[2]=1.0;
b1[0]=00000.0;b1[1]=4.0;b1[2]=0.0;b1[3]=1.0;
・ a = 20 の時 sin(20t) を加えた時
//Step+0.025*sin(20t) =1/s+0.05*20/(s^2+20^2) の分子側入力の設定
上記の式の分数の和は、以下の式となる。
( 400.0 + 20.0*0.025*s + s^2 ) / ( 400.0*s + s^3 )
従い、分母側はコード 1 のままで分子側は以下となる。
a1[0]=400.0;a1[1]=20.0*0.025;a1[2]=1.0;
b1[0]=00000.0;b1[1]=400.0;b1[2]=0.0;;b1[3]=1.0;
・ a = 200 の時 sin(200t) を加えた時
//Step+0.025*sin(200t) =1/s+0.025*200/(s^2+200^2) の分子側入力の設定
上記の式の分数の和は、以下の式となる。
( 40000.0 + 200.0*0.025*s + s^2 ) / ( 40000.0*s + s^3 )
従い、分母側はコード 1 のままで分子側は以下となる。
a1[0]=40000.0;a1[1]=200.0*0.025;a1[2]=1.0;
b1[0]=00000.0;b1[1]=40000.0;b1[2]=0.0;b1[3]=1.0;
・ a = 0.2 , 2 (radian/s) の時を下図に示す。
0.2 の時は、系に sin(0.2t) の挙動は現れていない。2 の時は、sin(2t) の挙動が現れている。
従い、低周波の時に、その項を考慮しないでよいと考えてもいいという結果である。
・ a = 20 , 200 (radian/s) の時を下図に示す。
20 の時は、系に sin(20t) の挙動が現れている。200 の時は、sin(200t) の挙動が現れていない。
従い、高い高周波の時には、その項を考慮しないでよいと考えてもいいという結果である。
4)Feedback回路の具体的な計算(コード1)
(1)コードの説明
・予めP(s)等の数を 8 とした。それらの積で計算するようにした。
・その係数を分子、分母伴に 最大 7 次とした。細野本等では5次であったので、+2とした。
・その係数を TR1 の array に代入するようにした。
しかしながら、array のfunction文内の宣言では、コンパイラーから、その記述の以外にも、配列の個
数を求められた。煩雑感を与える式となった。vectorでは、vector<double>の表示だけでよかったが。
・係数 a0[0] 等の初期値を 1.0 にすることで、0 の積を無くし、システムがゼロにならないようにした。
・Feedbackシステム全体では、(1+P(s)・・・) が分母になるので、1 を含めないで、積の個所だけを計
算し、その後に real_unit で複素数化した 1 を付け加えるようにした。
・Feedbackシステム (1+P(s)・・・) 適用の有無を feedwith で選択できるようにした。
・計算自体の失速防止のために、単純和の項数 k 制御の function 文を設けた。第5章逆ラプラス変換 3項
(項数 k の制御計算を判りやすくした。)
・Euler変換は 61 次で固定した。これは発散・失速が初期の数項の実数部と虚数部の位相が同じ位相面に
留まっている(複素平面上で同位相面にある)時に生じるので、変換の次数と直接な関係は無い事が判
っているために、61 次に固定とした。C++11 で long double が 64bit 以上になれば、もっと次数を
高く出来るのだが、今は叶わない。
・高速ラプラス変換の細野本で定義されていた打ち切り誤差の評価は、ここでは削除した。
(2)ボード線図用データ
第5章で、Bodeplot について、説明しているが、ここでもコード内で計算できるようにしたので触れる。
上記の式 5 の s = ( a + j( n - 0.5 ) π )/t (π:パイ) の複素数 s の実数部の a 、ここでは filt_a=0.0
およ
び、0.5 を 0 、(パラメータ spare0=0 )にすることで、得る事が出来るようにした。
具体的な、コードの記述を下記にしめす。下記の作業を行うと本コードでも計算できて、出力される。
//Bode_Plot 用 以下の5行のそれぞれの初めにある // を削除するとBode Plot 用に変化する。
//filt_a=0.0; //s の実数部をゼロにし、s の虚数部のみとする。
//k1=100; //nick=31.4の時、k1 は、f を 0.1 から
10rad/s 変化させる
//nick=31.4; //π/31.4 は 0.1 となる。
//repeat_no=2;//繰返し数が 2 未満であるので、1 回計算する。
//spare0=0; //0 の時、s の虚数中の -0.5 がゼロ。
次は、ゲインによるシステムの安定性の計算をFILTで容易に出来るようにする考えである。
3、使用したSTLと関数
1)array<double,n>、vector<complex<double>>、ofstream()、fraction[2].real(real(data))。
2)TR1::arrayについて
array<complex<double>,n>x は、許容される。しかしながら、虚数部の数値は得る事ができなかった。
再度、行う予定であるが、arrayでの複素数使用の際は、注意が必要である。
当 Page から他の page へ
Index c++から風と翼の計算へ
0、c++ 文字(半角/全角)、フォルダ生成、csv読み込み・書き込み、データ処理
1、c++ STL適用例
2、c++11調査、番外(多計算並列)
3、c++ 数値計算 1 三次・四次方程式、方程式求根、微分方程式、 最小二乗法、フーリエ変換
4、c++ 数値計算 2 連立一次方程式、補間法: Spline、Lagrange、Aitken、直交関数法
5、c++ 数値計算 3 逆ラプラス変換、移動則、Bode Plot
6、c++ 数値計算 4 Feedback回路、Euler変換(62次まで)、二項係数
7、c++ 数値計算 5 直交関数: Legendre(34次)、Chebyshev(35次)、Bessel 多項式級数展開:Legendre、Chebyshev
8、c++ 数値計算 6 数値積分(連続系): Newton-Cotes、Legendre、Gauss-Chebyshev
9、c++ 数値計算 7 数値積分(離散系): 不等間隔データ(Newton-Cotes法)
10、c++ 数値計算 8 行列式(余因子、 逆行列 )、行列(線形変換、固有値)
11、c++ 数値計算 9 積分方程式
12、c++ 数値計算 予備
13、c++ 技術計算 1 珪素鋼板 BH特性、BH特性の補間
14、c++ 技術計算 2 曲線の交点算出(Function文とClass)
15、予備
16、予備
17、よもやま話と時代の位相
18、予備
19、予備