- ベストアンサー
VBAで複素数の多項式展開
- VBAを使用して複素数の多項式展開を行いたいです。
- 10次程度の多項式を展開したいですが、実数の場合はできますが、複素数の場合は間違った解が出てきてしまいます。
- 正解にたどりつくための問題の指摘や正負の逆転の仕方について教えていただけると助かります。
- みんなの回答 (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) と 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
お礼
ありがとうございます!! >作業用変数を追加 まさに!!これが必要でした! 表記していただいたモジュールを実行したところ、 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