解決済

clip!clip!
Ads By Google

表計算ソフトでのプログラムについて。

表計算ソフトでax^2+bx+c=0を満たす
x を求める表を作成する方法を教えていただけないでしょうか?
入力 a、b、c がどのような値(0を含む)
になっても正しい値が出るようにしないといけないみたいです。
解は実数のみを考えても、複素数を考慮しても良いです。
宜しくお願いします。

2006-05-28 23:48の質問
入力  Excel  表計算  
Excel
「Microsoft Office Excel」のホームページです
office.microsoft.com/ja-jp/excel/
この質問と回答を読んで役に立った場合は「役に立つ質問」に投票してください。投票が多い質問は、役に立つ質問一覧に掲載され、より多くの人に見てもらうことができます。

回答(4)

1.

2006-05-29 01:08:14みんなナイスな
それを考えてる間にそのような問題を何問解けたと思う?
そういうことを考えるのは時間の無駄

2.

2006-05-29 09:41:45みんなナイスな
アドバイスですが、下のプログラムを参考にEXCELマクロに変換すればよいです。


回答レベル : アドバイス

3.

2006-05-30 03:02:42みんなナイスな
これは、単に2次方程式を解くのを自動化したい、とかいう問題ではないですねー。大学の宿題でしょうか。ax^2+bx+c=0という書き方はTeX記法に見えるので2年生でしょうか。。。

「表計算ソフト」と本文中では指定してあるので、OpenOfficeCalcとかでもいいのかと思ったのですが、タグにはExcelと書いてあって、カテゴリはVisualBasicになっていますねー。想像するに、ExcelのVBA(VisualBasic for Application)で解きたいの かな、という気がします。今回は、せっかくExcelなので、関数だけで済ませてみたいと思います。VBAはヒントだけにします。

数値計算で方程式を解くには、大きくわけて2種類の解き方があります。1つは解に係数を直接代入する方法で、もう1つは反復法と呼ばれるものです。2次方程式だと、解の公式がわかっているので、どちらのやり方でもできます。一般には、陽に解を書けないことが多いので、後者の方がよく使われます。前者を解1、後者を解2とします。

まず、準備として、A1、B1、C1のセルにa,b,cの値をそれぞれ入力しておきましょう。以下では実数解のみを考えます。

解1:解を表示したいセル(たとえばB5あたり)に次の関数を入力します。
=IF(AND(A1=0,B1=0,C1=0),"任意の数",IF(AND(A1=0,B1=0),"解なし",IF(A1=0,-C1/B1,(-B1+SQRT(B1*B1-4*A1*C1))/(2*A1))))
0のケースも考慮してありますので、長いですが、本質的には解の公式を適用しただけです。もう片一方の解も簡単に求まるはずです。実数解を持たないとエラーになりますが、もう一つIFで判別式をかませれば複素数解にも対応できます。

解2:反復法はいろいろやり方の工夫がありますが、素朴に、
x←-c/(ax+b)
という反復式でやってみます。(←は代入の意、←を=に置き換えて、元の式になるか確認して下さい。)
E1のセルに適当な初期値(たとえば1)を入力しましょう。次にE2のセルに
=-$C$1/($A$1*F1+$B$1)
という反復式を入力します。この後オートフィルしますので、a,b,cは絶対参照にしておきましょう。あとは、E2のセルを選択して、そのセルの右下あたりにあわせて「+」のフィルハンドルをだしてから、マウスボタンを押しっぱなしにして、下に向かって適当に引っ張りましょう。E100でも1000でも好きなだけやって下さい。だいたいのケースでは解に近づくと思います。
回答レベル : 回答

4.

2006-05-30 03:03:27みんなナイスな
>>3 の続き:
一番下のものを解として採用しましょう。初期値を変えるともう一つの解がみつかるかもしれません。

解2の性能が悪いと思ったら、改善の余地はかなりあります。ニュートン法のキーワードで調べると、たくさん情報がでてくると思います。

最後にVBAのためのヒントを載せます。

まず、ツール→マクロ→VBエディタを開いて、標準モジュールにプロシージャを追加します。解1の方針だと、基本形は、
Function sol(a, b, c)
 sol=(-b+Math.Sqr(b*b-4*a*c))/(2*a)
End Function
のような感じで、あとは、Excel関数をよく見ながら、IF文を追加してください。使い方は、例えば、さきほどのシートの適当なセルに、
=sol(A1,B1,C1)
とすれば、解が返ってきます。

解2の基本形は、
Function sol2(a, b, c)
 sol2 = 0
 For i = 0 To 1000
  sol2 = (-a * sol2 * sol2 - c) / b
 Next
End Function
みたいな感じです。こちらも使いやすいように改造してみて下さい。通常、反復は回数を指定するのではなく、一つ前の反復との差を取って、それが一定値より小さくなったら、反復終了という風にします。

ご健闘をお祈りします^^
回答レベル : 回答
Ads By Google

コメント(1)

2006-05-30 07:11:15

>>3
訂正です。

×=-$C$1/($A$1*F1+$B$1)
 ↓
○=-$C$1/($A$1*E1+$B$1)
E1と説明しておきながら、F1になっていました。すいません。

トラックバック(2)

トラックバックURL: