裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Julia/SymPy: 数値代入法による係数の決定

2022年01月11日 | ブログラミング
数学検定の準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
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村