数学検定の準1級1次に出題された「数値代入法」の問題
https://existence-scholar.com/modules/d3diary/index.php?page=detail&bid=2140
using SymPy
@syms a b c d x
左辺
l = 9/(x-1)^2/(x+2)^2
分数の和として表示(apart)
l2 = l |> apart
もうこれで,答えは出た。
l2 の係数を取り出す。
l2.coeff(1/(x-1)) |> print # -2/3 ... a
l2.coeff(1/(x-1)^2) |> print # 1 ... b
l2.coeff(1/(x+2)) |> print # 2/3 ... c
l2.coeff(1/(x+2)^2) |> print # 1 ... d
このやり方は,係数比較法というのだったかな。
別のやりかたの数値代入法は,右辺 a, b, c, d を未知数として
r = a/(x-1) + b/(x-1)^2 + c/(x+2) +d/(x+2)^2
l, r 式の x に 4 通りの値を与え,連立方程式を構成する。
eq1 = Eq(l(x=>2), r(x=>2))
eq2 = Eq(l(x=>3), r(x=>3))
eq3 = Eq(l(x=>4), r(x=>4))
eq4 = Eq(l(x=>5), r(x=>5))
eq1 |> print # Eq(9/16, a + b + c/4 + d/16)
eq2 |> print # Eq(9/100, a/2 + b/4 + c/5 + d/25)
eq3 |> print # Eq(1/36, a/3 + b/9 + c/6 + d/36)
eq4 |> print # Eq(9/784, a/4 + b/16 + c/7 + d/49)
連立方程式を解く
solve([eq1, eq2, eq3, eq4], [a, b, c, d])
結果
Dict{Any, Any} with 4 entries:
a => -2/3
d => 1
c => 2/3
b => 1
連立方程式を解く別法
係数行列(1//2 などは分数)
A = [1//1 1//1 1//4 1//16
1//2 1//4 1//5 1//25
1//3 1//9 1//6 1//36
1//4 1//16 1//7 1//49]
右辺
constant = [9//16, 9//100, 1//36, 9//784]
A * [a, b, c, d] = constant を解けば解が求められる。
A \ constant # 逆行列を使わない Julia での記法
解(a, b, c, d の順)
4-element Vector{Rational{Int64}}:
-2//3
1//1
2//3
1//1
左辺から右辺を引くと 0 になることを確認
l - r(a=>-2//3, b=>1, c=>2//3, d=>1) |> simplify |> print # 0