- ベストアンサー
エクセル・高次方程式の生の整数解
整数解はいくつもあるので、どう処理すればいいか悩んでいます。 例えばこんな式です。 1/3 a + 1/6 b + 1/20 c +1/30 d > 8.5 を満たすabcd (生の整数)の値を求めたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
digimr128 さん、こんにちわ 【1】用語の間違い まずは、digimr128さんが例として挙げているのは、高次式ではなく、多元式です。高次式は、べき乗(特に3乗以上)が登場する式ですね。多元式とは、未知数が複数(今回の例ならa、b、c、dの4つ)存在する数式と定義されます。 さらに、方程式ではなく、不等式です。方程式は、「未知数を含む等式」を指しますので、必ず右辺と左辺は「イコール」で結ばれています。不等式とは、右辺と左辺が不等号で結ばれている数式と定義されます。 つまり、digimr128さんが例示したのは、「多元不等式」になります。 また、「生の整数」というのは、「正の整数」の誤記でしょうか? とりあえず、「多元不等式を満たす正の整数を求めたい」という前提で考えてみます。 【2】解の個数の有限・無限 次に、digimr128さんが例として挙げた多元不等式ですが、解が無限個存在します。例えば、bとcとdが全て最小の値(すなわち全て1)のでも、aが25のとき、 1/3×a + 1/6×b + 1/20×c + 1/30×d の結果は8.58333・・・となり、 > 8.5 を満たします。つまり、aの値は、25以上であればなんであっても例示した不等式を満たすことになります。いくらExcelが優れていても、解が無限個存在する場合の処理を終えることはできません。ちなみに結論から言うと、不等号の向きが逆であれば、解の個数は有限個となります。 ここでもとりあえず、不等号の向きが逆であるとします。 さて、これをExcelで解くためには、マクロを利用します。 私が試してみたところ、なんと2,032,761通りの答えが存在すると出ました。。。。 解答の組合せを全て記載するマクロを作成したのですが、私のExcelはバージョンが古く、65536行までしか利用できないため、下のマクロは、何通り答えがあるかだけを表示するものとなっています。 (簡単な改造で結果を表示できるようにしてあります) ちなみに式の右辺が1のときは93通り、以下 右辺が2 → 3,677通り 右辺が3 → 23,731通り 右辺が4 → 84,074通り 右辺が5 → 219,083通り となります。では以下に、実際のマクロの運用方法を記載します。 新規シートを開き、Sheet1のA1セルに、8.5(不等式の右辺)を、 B1セルには 3 (aの除数)、C1セルには 6 (bの除数)、D1セルには 20 (cの除数)、E1セルには 30 (dの除数) を記入します。一応、e、f、g、・・・と要素が増えていっても、F1列、G1列、H1列・・・へ追記していけば計算ができるように作ってあります。 記入が終わったら下の、「Sheet1」タブを右クリックし、「コードの表示」をクリックします。 すると、「Microsoft Visual Basic」ウィンドウが表示されるので、ウィンドウ右側の空欄に、以下を貼り付けます。 '--------------------------------------ここからコピー-------------------------------------- Sub SumVariation() Dim InputV() As Integer Dim InputC() As Integer Dim DMS As Integer Dim TgtVAL As Single Dim SUMVAL As Single Dim OutRow As Long Range(Cells(2, 1), Cells(Range("A:A").End(xlDown).Row, 256)).Delete DMS = Range("1:1").End(xlToRight).Column - 1 ReDim InputV(DMS) ReDim InputC(DMS) OutRow = 2 TgtVAL = Cells(1, 1).Value For i# = 1 To DMS InputV(i) = 1 InputC(i) = Cells(1, i + 1) Next i Do While (1) SUMVAL = 0 For i = 1 To DMS SUMVAL = SUMVAL + InputV(i) / InputC(i) Next i If SUMVAL < TgtVAL Then ' Cells(OutRow, 1).Value = SUMVAL ' For i = 1 To DMS ' Cells(OutRow, i + 1).Value = InputV(i) ' Next i OutRow = OutRow + 1 InputV(1) = InputV(1) + 1 Else For i = 1 To DMS - 1 InputV(i) = 1 InputV(i + 1) = InputV(i + 1) + 1 SUMVAL = 0 For j# = 1 To DMS SUMVAL = SUMVAL + InputV(j) / InputC(j) Next j If SUMVAL < TgtVAL Then GoTo CONTINUE Next i MsgBox "解の個数は" & OutRow - 2 & "個です" Exit Sub CONTINUE: End If ' If OutRow = 65536 Then ' MsgBox "これ以上演算できません" ' Exit Sub ' End If Loop End Sub '--------------------------------------ここまでコピー-------------------------------------- 貼り付けが終わったら、一度貼り付けた文章の上で念のためマウスをクリックし、「F5」キーを押すと、処理が始まります。処理が終わったら、何通り解答があるかのメッセージが表示されます。 ちなみに、上で貼り付けた文章から、シングルクォーテーション(')を削除すると、解答の組み合わせがExcelのシート上に記載されます。 (処理に時間がかかる上に、解答の組み合わせが65535通りを超えたら処理を中断します) 参考になりましたでしょうか。
お礼
参考になり過ぎて、感動です。 マクロは日頃あまり使わないのですが、 ちょっと背伸びしてみました。 丁寧な回答を、ありがとうございました。