みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBAで、複素数の多項式展開がしたい

はじめまして
初めて質問させていただきます。

私は、VBAにて10次程度の多項式
(X-A-Bi)(X-C-Di)…   (1)

α10*x^10+α9*x^9…    (2)
に展開したく、プログラムを製作しています。

(1)の解が実数のみ(A、C)の場合の
展開は製作することができました。
-----------------------------------------
Sub tenkai()

Dim ji As Integer

Dim A(10) As Double
Dim X(11) As Double

ji = Cells(1, 2).Value '次数の入力

For i = 0 To ji
A(i) = Cells(3, 12 - i) '解の入力
X(i) = 1
Next i

X(0) = A(1)

For n = 2 To ji

X(n) = X(n - 1)
X(n) = X(n - 1)

For i = n - 1 To 1 Step -1
X(i) = X(i - 1) + A(n) * X(i)
Next i

X(0) = A(n) * X(0)
Next n

For i = 0 To ji
Cells(8, 12 - i) = X(i)
Next i

End Sub
-------------------------------------
上記は、正負は逆になるのですが、一応の答えは出ます。
しかし、これに複素数を考慮したところ、
まったく間違った解が出てきてしまいます。
-------------------------------------
Sub tenkai2()

Dim ji As Integer

Dim Ar(10) As Double
Dim Ai(10) As Double
Dim Xr(11) As Double
Dim Xi(11) As Double

ji = Cells(1, 2).Value '次数の入力

For i = 0 To ji
Ar(i) = Cells(3, 12 - i) '解の入力(実数)
Ai(i) = Cells(4, 12 - i) '解の入力(複素数)
Xr(i) = 1
Xi(i) = 0
Next i

Xr(0) = Ar(1)
Xi(0) = Ai(1)

For n = 2 To ji

Xr(n) = Xr(n - 1)
Xi(n) = Xi(n - 1)

For i = n - 1 To 1 Step -1
Xr(i) = Xr(i - 1) + Ar(n) * Xr(i) - Ai(n) * Xi(i)
Xi(i) = Xi(i - 1) + Ar(n) * Xi(i) + Ai(i) * Xr(i)
Next i

Xr(0) = Ar(n) * Xr(0) - Ai(n) * Xi(0)
Xi(0) = Ar(n) * Xi(0) + Ai(n) * Xr(0)
Next n

For i = 0 To ji
Cells(8, 12 - i) = Xr(i)
Cells(9, 12 - i) = Xi(i)
Next i

End Sub
--------------------------------------
式の解はあっても、展開については解説サイトがなく、
どうしても、正解にたどりつくことができず困っています。
どなたか問題を指摘していただく事はできませんでしょうか?

もしわかれば、
正負の逆転の仕方についても、教えて頂ければと思います。
C言語の解説サイトなどでも理解ができます。

投稿日時 - 2007-05-10 15:42:29

QNo.2988806

J2J

すぐに回答ほしいです

質問者が選んだベストアンサー

久しぶりに『複素数』という文字を見て、考えて見ました。

基本的な考え方は合っていると思います。

計算の途中、
  Xr(i) = Xr(i - 1) + Ar(n) * Xr(i) - Ai(n) * Xi(i)
  Xi(i) = Xi(i - 1) + Ar(n) * Xi(i) + Ai(i) * Xr(i)

  Xr(0) = Ar(n) * Xr(0) - Ai(n) * Xi(0)
  Xi(0) = Ar(n) * Xi(0) + Ai(n) * Xr(0)

の箇所で、Xr(i)とXr(0)を再計算してしまって、それを次の行で使用しています。
これが原因でおかしな結果になるでしょう。下のコードはそれを回避してみました。
(『//** 』を付加している行が変更箇所です)

実数を『+1』、虚数部分を『非常に小さく』してみると、パスカルの三角形の値が出るので、合っているかと思います。
答えがあれば照合してください。

>正負の逆転の仕方についても、教えて頂ければと思います。
質問のモジュールは (X+b+ci) の形式の掛け算を展開しています。b、cが正として作られています。
(X-b-ci) を解くようにb、cをセットするのであれば、読み込み時点で定数の符号を逆転させればいいでしょう。(下記を参照してください)


Sub tenkai2()
  Dim i As Integer   '//** 追加
  Dim n As Integer   '//** 追加
  Dim ji As Integer
  
  Dim Ar(10) As Double
  Dim Ai(10) As Double
  Dim Xr(11) As Double
  Dim Xi(11) As Double
  
  ji = Cells(1, 2).Value '次数の入力
  
  For i = 0 To ji
    Ar(i) = -Cells(3, 12 - i) '解の入力(実数) //**逆符号で取り込む
    Ai(i) = -Cells(4, 12 - i) '解の入力(複素数)//**逆符号で取り込む
    Xr(i) = 1
    Xi(i) = 0
  Next
  
  Dim Xr0 As Double  '//** 作業用変数を追加
  Dim Xi0 As Double  '//** 作業用変数を追加
  
  Xr(0) = Ar(1)
  Xi(0) = Ai(1)
  For n = 2 To ji
    Xr(n) = Xr(n - 1)
    Xi(n) = Xi(n - 1)
    For i = n - 1 To 1 Step -1
      '//** 互いに干渉しないように計算するよう変更(下4行)
      Xr0 = Xr(i - 1) + Ar(n) * Xr(i) - Ai(n) * Xi(i)
      Xi0 = Xi(i - 1) + Ar(n) * Xi(i) + Ai(i) * Xr(i)
      Xr(i) = Xr0
      Xi(i) = Xi0
    Next
    
    '//** 互いに干渉しないように計算するよう変更(下4行)
    Xr0 = Ar(n) * Xr(0) - Ai(n) * Xi(0)
    Xi0 = Ar(n) * Xi(0) + Ai(n) * Xr(0)
    Xr(0) = Xr0
    Xi(0) = Xi0
  Next
    
  For i = 0 To ji
    Cells(8, 12 - i) = Xr(i)
    Cells(9, 12 - i) = Xi(i)
  Next
End Sub

投稿日時 - 2007-05-13 06:24:58

お礼

ありがとうございます!!
>作業用変数を追加
まさに!!これが必要でした!

表記していただいたモジュールを実行したところ、
3次までしか精巧な値は得られませんでした。

そこで、再度、紙とペンで式を展開し、
問題であろう、
  Xr(i) = Xr(i - 1) + Ar(n) * Xr(i) - Ai(n) * Xi(i)
  Xi(i) = Xi(i - 1) + Ar(n) * Xi(i) + Ai(i) * Xr(i)
を変更したところ、正常に作動を確認する事ができました。

nishi6さんのアドバイスと、
>「基本的な考え方は合っていると思います。」
という、お褒めの言葉が実現につながりました。
大変うれしかったです。
感謝いたします!ありがとうございました!

以下に、完成したソースを載せておきます。
('//でくくった点が変更点)
--------------------------------------------
Sub tenkai4()

Dim ji As Integer

Dim Ar(10) As Double
Dim Ai(10) As Double
Dim Xr(11) As Double
Dim Xi(11) As Double
Dim TEMPr(11) As Double
Dim TEMPi(11) As Double

ji = Cells(1, 2).Value '//次数の入力

For i = 0 To ji
Ar(i) = -Cells(3, 12 - i) '//解の入力(実数)
Ai(i) = -Cells(4, 12 - i) '//解の入力(複素数)
Xr(i) = 1
Xi(i) = 0

'//
TEMPr(i) = 0 '作業用変数を追加
TEMPi(i) = 0 '作業用変数を追加
'//
Next i

For n = 1 To ji

'//
'//以下、変更点/

For i = n - 1 To 0 Step -1
TEMPr(i + 1) = TEMPr(i + 1) + Xr(i)
TEMPr(i) = TEMPr(i) + (Xr(i) * Ar(n) - Xi(i) * Ai(n))
TEMPi(i + 1) = TEMPi(i + 1) + Xi(i)
TEMPi(i) = TEMPi(i) + (Xr(i) * Ai(n) + Xi(i) * Ar(n))
Next i

For i = 0 To n
Xr(i) = TEMPr(i)
Xi(i) = TEMPi(i)
TEMPr(i) = 0
TEMPi(i) = 0
Next i

'//変更点終わり/
'//

Next n

For i = 0 To ji
Cells(8, 12 - i) = Xr(i)
Cells(9, 12 - i) = Xi(i)
Next i

End Sub

投稿日時 - 2007-05-14 21:22:51

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問