PCガジェットはいつでも安いAmazonで!

If文で二次方程式の解の公式をプログラミング

目次

はじめに

VBAゼロからシリーズです。

あわせて読みたい
プログラマーの国家資格を持つ筆者が教えるVBAの独学ロードマップ はじめに エクセルVBAはエクセルのプログラミング言語です。 使えると様々なエクセル作業を自動化できます。 今回はその独学のノウハウをプログラマーの国家資格である...

適当な例題を探していたのですが、なかなかいいものが見つからないので、今回は簡単な数学の問題とプログラミングを組み合わせてみます。

簡単な価格決定の問題をプログラミングを使って解いてみようという話です。

二次方程式の解の公式がわかればできるくらいの問題をやっていきます。

今回は解の公式をプログラミングで表現します。

主にIf文で書いていきます。

数学はプログラミングと相性がいいので、これからもちょくちょくこういう回があると思いますが、中学、高校くらいの数学の授業を思い出しながら読み進めていただければと思います。

今回の問題

ある製品を一個500円で仕入れて510円で売ると一日200個売れる。

一個につき一円値上げすると一日の売り上げ個数は10個減る。

利益を最大にするためには一個いくらで売ればよいだろうか。

解き方

一個\(x\)円で売るとして、一日の利益を\(f\)とすると次のようになる。

\[
f=(x-500)\{200-10(x-510)\}
\]

(価格-原価)×個数

ですね。

これを展開して整理すると

\[
f=-10x^{2}+10300x-2650000
\]

\[
f=-10(x-515)^{2}+2250
\]

\(f\)のグラフは上に凸であり、最大値では\(x=515\)となるので利益が最大になるときは一個515円のときである。

発展問題

利益が一個510円で売った時より大きくなるのは何円から何円の範囲か。

解き方

次の不等式を解く。

\[
-10x^{2}+10300x-2650000>200(510-500)
\]

これを整理すると

\[
-10x^{2}+10300x-2652000>0
\]

\[
-10x^{2}+10300x-2652000=0
\]

を\(x\)について解く。

解の公式より

\[
x=510,520
\]

よって510円から520円の範囲で売れば510円で売ったときより利益が大きくなる。

プログラミングの介入する余地はどこか

今回は解の公式をプログラミングします。

2aぶんの、まいなすびー、ぷらすまいなす、るーと、びーにじょう、まいなすよんえーしー。

結構手計算すると面倒なので、パッとでるようにします。

解の公式をVBAで計算してみる

次のようなVBAを書きます。

Sub SolutionFormula()
    Dim a As Double
    Dim b As Double
    Dim c As Double
    Dim D As Double
    a = Range("B3").Value
    b = Range("C3").Value
    c = Range("D3").Value
    D = b * b - 4# * a * c
    If D > 0 Then
        Range("E3").Value = (-b + Sqr(D)) / (2 * a)
        Range("F3").Value = (-b - Sqr(D)) / (2 * a)
    ElseIf D = 0 Then
        Range("E3").Value = (-b) / (2 * a)
        Range("F3").Value = "No solution"
    ElseIf D < 0 Then
        Range("E3").Value = "No solution"
        Range("F3").Value = "No solution"
    End If
End Sub

解の公式自体の解説は省略します。

If文で分岐させているのは、解が2個か、1個か、ないのか(虚数解)で3分岐させています。

あとは公式を計算させているだけです。

D = b * b – 4# * a * c

の部分で4#とあるのはただの整数の4ではなく、浮動小数の4という意味です。

計算させると510と520が出力されます。

まとめ

今回は二次方程式の解の公式の部分を自動化してみました。

手計算でa、b、cを変形させていくと間違いやすいので、プログラムで検算してみるといいかもしれませんね。

ただまあ最初の利益の式をプログラムで展開するというのは結構難しいので、手計算で数学が解けるというのも大事でしょうね。

目次