はじめまして
初めて質問させていただきます。
私は、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言語の解説サイトなどでも理解ができます。
No.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
scanfが2回使えない・・・?;
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
ワードで文字を入力する時の変...
-
EDITコントロールで入力できる...
-
C言語 for文をつかって記号を表...
-
"scanf"でエンターで改行させな...
-
VisualStudio2019のコードアナ...
-
C言語・YesNo入力のループで解...
-
至急教えてください!プログラ...
-
入力する数字のサイズ制限について
-
cout関数を使っているのですが...
-
C言語(構造体)
-
C言語について
-
入力候補を表示させるには・・・?
-
C++ Builder Xを使って実行結果...
-
Eclipseコンソール表示を、リセ...
-
batプログラム上で文字列を入力...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
Eclipseコンソール表示を、リセ...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
cout関数を使っているのですが...
-
ワードで文字を入力する時の変...
-
VB.NETで16進数+16進数や16進...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
入力候補を表示させるには・・・?
-
getchar()について 教えてくだ...
-
プログラミングの問題です 「金...
-
Linuxで入力待ちなしkeyread関...
-
Userformの入力順序をタブオー...
-
コマンドプロンプトからのEOFの...
-
VisualStudio2019のコードアナ...
-
WindowsでEOF
-
"gets"は危険なのでしょうか?
おすすめ情報