算額(その262)
中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額2(71)
長野県長野市 久保寺観音堂 享和3年(1803)
鉤股弦(直角三角形)の中に円と正方形が入っている。
方の一辺と円の直径の積が 672 平方寸,鉤股弦の周と中鉤の積が 5644.8 平方寸であるとき,方面(正方形の一辺)を求めよ。
注:この 2 つの数値を,小数でなくするために 10 倍するのは,正しくない。
以下の連立方程式を解く。
include("julia-source.txt");
using SymPy
@syms 鉤::positive, 股::positive, 弦::positive,
中鉤::positive, 長弦::positive, 短弦::positive,
方面::positive, 径::positive;
eq1 = 鉤^2 + 股^2 - 弦^2
eq2 = 短弦^2 + 中鉤^2 - 鉤^2
eq3 = 長弦^2 + 中鉤^2 - 股^2
eq4 = 弦 - 長弦 - 短弦
eq5 = 方面 * 径 - 672.0
eq6 = (鉤 + 股 + 弦) * 中鉤 - 5644.8
eq7 = 鉤 + 股 - 弦 - 径
eq8 = 方面 * (方面 + (股 - 方面)/2 + (鉤 - 方面)/2) - 鉤 * 股 / 2;
res = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8]) #, (鉤, 股, 弦, 中鉤, 長弦, 短弦, 方面, 径))
2-element Vector{Dict{Any, Any}}:
Dict(股 => 56.0000000000000, 弦 => 70.0000000000000, 径 => 28.0000000000000, 短弦 => 25.2000000000000, 長弦 => 44.8000000000000, 方面 => 24.0000000000000, 鉤 => 42.0000000000000, 中鉤 => 33.6000000000000)
Dict(股 => 42.0000000000000, 弦 => 70.0000000000000, 径 => 28.0000000000000, 短弦 => 44.8000000000000, 長弦 => 25.2000000000000, 方面 => 24.0000000000000, 鉤 => 56.0000000000000, 中鉤 => 33.6000000000000)
2 つの解が求まる。最初の解は「鉤 < 股」で,もう一方は裏返しに反転して回転する「鉤 > 股」のもので,本質的に同じものである。
なお,「solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8], (鉤, 股, 弦, 中鉤, 長弦, 短弦, 方面, 径))」とすると解が求まらない(有限の時間内にできなさそう)。
for i = 1:2
println("***** i = $i *****")
println((res[i][鉤], res[i][股], res[i][弦], res[i][中鉤], res[i][長弦], res[i][短弦], res[i][方面], res[i][径]))
end
***** i = 1 *****
(42.0000000000000, 56.0000000000000, 70.0000000000000, 33.6000000000000, 44.8000000000000, 25.2000000000000, 24.0000000000000, 28.0000000000000)
***** i = 2 *****
(56.0000000000000, 42.0000000000000, 70.0000000000000, 33.6000000000000, 25.2000000000000, 44.8000000000000, 24.0000000000000, 28.0000000000000)
鉤 = 42.00; 股 = 56.00; 弦 = 70.00; 中鉤 = 33.60; 長弦 = 44.80; 短弦 = 25.20; 方面 = 24.00; 径 = 28.00
答え:方面は 24 寸である。
using Printf
using Plots
function draw(more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(鉤, 股, 弦, 中鉤, 長弦, 短弦, 方面, 径) = (42.0000000000000, 56.0000000000000, 70.0000000000000, 33.6000000000000, 44.8000000000000, 25.2000000000000, 24.0000000000000, 28.0000000000000)
# (鉤, 股, 弦, 中鉤, 長弦, 短弦, 方面, 径) = (56.0000000000000, 42.0000000000000, 70.0000000000000, 33.6000000000000, 25.2000000000000, 44.8000000000000, 24.0000000000000, 28.0000000000000)
@printf("鉤 = %.2f; 股 = %.2f; 弦 = %.2f; 中鉤 = %.2f; 長弦 = %.2f; 短弦 = %.2f; 方面 = %.2f; 径 = %.2f\n", 鉤, 股, 弦, 中鉤, 長弦, 短弦, 方面, 径)
plot([股, 股, 0, 股, 長弦*股/弦], [ 0, 鉤, 0, 0, 長弦*鉤/弦], linecolor=:black, linewidth=0.5)
circle(股 - 径/2, 径/2, 径/2)
plot!([股 - 方面, 股 - 方面, 股], [0, 方面, 方面], color=:black, lw=0.5)
if more == true
point(股 - 径/2, 径/2, "\n円:径/2\n(股-径/2,径/2)", :red, :center, :top)
point(股 - 方面, 方面, "(股-方面,方面)", :red, :right, :bottom)
point(股, 鉤/2, " 鉤", mark=false)
point(股/2, 0, "股 ", :green, :right, :bottom, mark=false)
point((股 + 長弦*股/弦)/2, 長弦*鉤/弦/2, " 中鉤", mark=false)
point(長弦*股/弦/2, 長弦*鉤/弦/2, "長弦 \n", :green, :right, mark=false)
point((股 + 長弦*股/弦)/2, (鉤 + 長弦*鉤/弦)/2, "短弦\n", :green, :right, :bottom, mark=false)
point(股/2, 鉤/2, "弦 = 長弦 + 短弦 ", :green, :right, mark=false)
hline!([0], color=:black, lw=0.5)
vline!([0], color=:black, lw=0.5)
else
plot!(showaxis=false)
end
end;