前々日と前日に複素数の逆行列と行列の積の関数をエクセルのVBAで書いてみた。
では、その応用は??ということで、電気の交流回路の基本的な計算を
行なってみた。キルヒホッフの法則で、連立方程式を立ててみました。
図5

エクセルでの計算結果

図7

エクセルでの計算結果

図8

エクセルでの計算結果

回路図は、同じでないが、基本的に全部同様な連立方程式を解いているだけです。
一度フォームを作ると、データを入れ替えるだけで、次々に
連立方程式を解くことが出来ます。
Public Function IMMult(aa As Variant, bb As Variant) As Variant Dim a As Variant, b As Variant Dim ra() As Double, ia() As Double, rb() As Double, ib() As Double Dim la1 As Integer, ua1 As Integer, la2 As Integer, ua2 As Integer Dim lb1 As Integer, ub1 As Integer, lb2 As Integer, ub2 As Integer Dim i As Integer, j As Integer Dim rr As Variant, ii As Variant Dim ccc As Variant a = aa b = bb la1 = LBound(a, 1) ua1 = UBound(a, 1) la2 = LBound(a, 2) ua2 = UBound(a, 2) lb1 = LBound(b, 1) ub1 = UBound(b, 1) lb2 = LBound(b, 2) ub2 = UBound(b, 2) ReDim ra(la1 To ua1, la2 To ua2), ia(la1 To ua1, la2 To ua2) ReDim rb(lb1 To ub1, lb2 To ub2), ib(lb1 To ub1, lb2 To ub2) For i = la1 To ua1 For j = la2 To ua2 ra(i, j) = ImReal(a(i, j)) ia(i, j) = Imaginary(a(i, j)) Next Next For i = lb1 To ub1 For j = lb2 To ub2 rb(i, j) = ImReal(b(i, j)) ib(i, j) = Imaginary(b(i, j)) Next Next rr = add(WorksheetFunction.MMult(ra, rb), negamtrix(WorksheetFunction.MMult(ia, ib))) ii = add(WorksheetFunction.MMult(ia, rb), WorksheetFunction.MMult(ra, ib)) la1 = LBound(rr, 1) ua1 = UBound(rr, 1) la2 = LBound(rr, 2) ua2 = UBound(rr, 2) ReDim ccc(la1 To ua1, la2 To ua2) For i = la1 To ua1 For j = la2 To ua2 ccc(i, j) = Complex(rr(i, j), ii(i, j)) Next Next IMMult = ccc End Function
Public Function add(a As Variant, b As Variant) As Variant Dim i As Integer, j As Integer Dim aad As Variant aad = a For i = LBound(aad, 1) To UBound(aad, 1) For j = LBound(aad, 2) To UBound(aad, 2) aad(i, j) = aad(i, j) + b(i, j) Next Next add = aad End Function
Public Function negamtrix(a As Variant) As Variant Dim i As Integer, j As Integer Dim aa As Variant aa = a For i = LBound(aa, 1) To UBound(aa, 1) For j = LBound(aa, 2) To UBound(aa, 2) aa(i, j) = aa(i, j) * -1 Next Next negamtrix = aa End Function
Public Function cc(a As Variant, b As Variant) As Variant Dim c As Variant c = WorksheetFunction.MMult(b, WorksheetFunction.MInverse(a)) c = WorksheetFunction.MMult(c, b) c = add(a, c) c = WorksheetFunction.MInverse(c) cc = c End Function Public Function dd(a As Variant, b As Variant) As Variant Dim d As Variant, c As Variant c = cc(a, b) d = WorksheetFunction.MMult(WorksheetFunction.MInverse(a), b) d = WorksheetFunction.MMult(d, c) d = negamtrix(d) dd = d End Function
Public Function complexdim(a As Variant, b As Variant) As Variant Dim i As Integer, j As Integer Dim l As Integer, u As Integer Dim complexdi As Variant l = LBound(a, 1) u = UBound(a, 1) ReDim complexdi(l To u, l To u) For i = LBound(a, 1) To UBound(a, 1) For j = LBound(a, 2) To UBound(a, 2) complexdi(i, j) = Complex(a(i, j), b(i, j)) Next Next complexdim = complexdi End Function
Public Function IMinverse(a As Variant, b As Variant) As Variant IMinverse = complexdim(cc(a, b), dd(a, b)) End Function
Public Function cIMinverse(a As Variant) As Variant Dim aa As Variant Dim la1 As Integer, ua1 As Integer, la2 As Integer, ua2 As Integer Dim rr As Variant, ii As Variant Dim i As Integer, j As Integer aa = a la1 = LBound(aa, 1) ua1 = UBound(aa, 1) la2 = LBound(aa, 2) ua2 = UBound(aa, 2) ReDim rr(la1 To ua1, la2 To ua2), ii(la1 To ua1, la2 To ua2) For i = la1 To ua1 For j = la2 To ua2 rr(i, j) = ImReal(aa(i, j)) ii(i, j) = Imaginary(aa(i, j)) Next Next cIMinverse = IMinverse(rr, ii) End Function
Public Sub seiki() Dim i As Integer '乱数発生数 For i = 1 To 10000 '平均5、標準偏差10の乱数 Cells(i, 1).Value = WorksheetFunction.NormInv(Rnd, 5, 10) Next End Sub
Public Sub f() Dim d(1 To 1000) As Variant Dim dn(1 To 10) As Variant Dim i As Integer, ii As Integer For i = 1 To 1000 For ii = 1 To 10 dn(ii) = Cells((i - 1) * 10 + ii, 1) Next d(i) = WorksheetFunction.Average(dn) Next Debug.Print WorksheetFunction.Average(d) Debug.Print WorksheetFunction.StDevP(d) Debug.Print 10# / Sqr(10) End Sub
//配列 List<Integer> l = new ArrayList<Integer>(); //配列に数字を代入 for(int i=0;i<10;++i){ l.add(i); } //まず、シャッフル前に配列内を表示 StringBuffer sb = new StringBuffer(); for(int i=0;i<10;++i){ sb.append(l.get(i)); } System.out.println(sb.toString()); sb.delete(0, sb.length()); //5回シャッフルする for(int ii=0;ii<5;++ii){ //シャッフル Collections.shuffle(l); for(int i=0;i<10;++i){ sb.append(l.get(i)); } //シャッフル後の数字を表示 System.out.println(sb.toString()); sb.delete(0, sb.length()); }
Public Sub seiki() Dim i As Integer '乱数発生数 For i = 1 To 10000 '平均0、標準偏差1の乱数 Cells(i, 1).Value = WorksheetFunction.NormInv(Rnd, 0, 1) Next End Sub