算額(その1688)
山形県新庄市 戸沢神社 文政元年(1818)
http://www.wasan.jp/yamagata/tozawa.html
キーワード:正方形3個,長方形
#Julia, #SymPy, #算額, #和算,#数学
長方形の中に大中小 3 個の正方形を容れる。長方形の長辺,短辺の長さが与えられたとき,小正方形の一辺の長さはいかほどか。
長方形の長辺,短辺を a, b
点 A の座標を (0, y2)
点 B の座標を (x2, y1)
点 C の座標を (x3, y6)
点 D の座標を (x1, b)
点 E の座標を (x5, 0)
点 F の座標を (a, y3)
点 G の座標を (x4, y4)
点 H の座標を (a, y5)
点 I の座標を (x6, b)
とおき,以下の連立方程式を解く。
SymPy の能力上,解析解は求められないので,数値解を求める。
include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf
using SymPy
@syms x1::positive, x2::positive, x3::positive, x4::positive, x5::positive, x6::positive, a::positive,
y1::positive, y2::positive, y3::positive, y4::positive, y5::positive, y6::positive, b::positive
AB = (x2^2 + (y2 - y1)^2)
eq1 = AB - ((x3 - x2)^2 + (y6 - y1)^2) |> expand
eq2 = AB - ((x3 - x1)^2 + (b - y6)^2) |> expand
eq3 = AB - (x1^2 + (b - y2)^2) |> expand
BE = (x5 - x2)^2 + y1^2
eq4 = BE - ((a - x5)^2 + y3^2) |> expand
eq5 = BE - ((a - x4)^2 + (y4 - y3)^2) |> expand
eq6 = BE - ((x4 - x2)^2 + (y4 - y1)^2) |> expand
GH = (a - x4)^2 + (y5 - y4)^2
eq7 = GH - ((a - x6)^2 + (b - y5)^2) |> expand
eq8 = GH - ((x6 - x3)^2 + (b - y6)^2) |> expand
eq9 = GH - ((x4 - x3)^2 + (y6 - y4)^2) |> expand
eq10 = x2 - (b - y2)
eq11 = (a - x2) - y4
eq12 = (a - x3) - (b - y4);
# res = solve([eq1, eq2, eq3, eq4, eq5, eq6, eq7, eq8, eq9, eq10, eq11, eq12],
# (x1, x2, x3, x4, x5, x6, y1, y2, y3, y4, y5, y6))
println(eq1, ", # eq1")
println(eq2, ", # eq2")
println(eq3, ", # eq3")
println(eq4, ", # eq4")
println(eq5, ", # eq5")
println(eq6, ", # eq6")
println(eq7, ", # eq7")
println(eq8, ", # eq8")
println(eq9, ", # eq9")
println(eq10, ", # eq10")
println(eq11, ", # eq11")
println(eq12, ", # eq12")
2*x2*x3 - x3^2 - 2*y1*y2 + 2*y1*y6 + y2^2 - y6^2, # eq1
-b^2 + 2*b*y6 - x1^2 + 2*x1*x3 + x2^2 - x3^2 + y1^2 - 2*y1*y2 + y2^2 - y6^2, # eq2
-b^2 + 2*b*y2 - x1^2 + x2^2 + y1^2 - 2*y1*y2, # eq3
-a^2 + 2*a*x5 + x2^2 - 2*x2*x5 + y1^2 - y3^2, # eq4
-a^2 + 2*a*x4 + x2^2 - 2*x2*x5 - x4^2 + x5^2 + y1^2 - y3^2 + 2*y3*y4 - y4^2, # eq5
2*x2*x4 - 2*x2*x5 - x4^2 + x5^2 + 2*y1*y4 - y4^2, # eq6
-2*a*x4 + 2*a*x6 - b^2 + 2*b*y5 + x4^2 - x6^2 + y4^2 - 2*y4*y5, # eq7
a^2 - 2*a*x4 - b^2 + 2*b*y6 - x3^2 + 2*x3*x6 + x4^2 - x6^2 + y4^2 - 2*y4*y5 + y5^2 - y6^2, # eq8
a^2 - 2*a*x4 - x3^2 + 2*x3*x4 - 2*y4*y5 + 2*y4*y6 + y5^2 - y6^2, # eq9
-b + x2 + y2, # eq10
a - x2 - y4, # eq11
a - b - x3 + y4, # eq12
function driver(a, b)
function H(u)
(x1, x2, x3, x4, x5, x6, y1, y2, y3, y4, y5, y6) = u
return [
x2^2 - (-x2 + x3)^2 + (-y1 + y2)^2 - (-y1 + y6)^2, # eq1
x2^2 - (b - y6)^2 - (-x1 + x3)^2 + (-y1 + y2)^2, # eq2
-x1^2 + x2^2 - (b - y2)^2 + (-y1 + y2)^2, # eq3
y1^2 - y3^2 - (a - x5)^2 + (-x2 + x5)^2, # eq4
y1^2 - (a - x4)^2 + (-x2 + x5)^2 - (-y3 + y4)^2, # eq5
y1^2 - (-x2 + x4)^2 + (-x2 + x5)^2 - (-y1 + y4)^2, # eq6
(a - x4)^2 - (a - x6)^2 - (b - y5)^2 + (-y4 + y5)^2, # eq7
(a - x4)^2 - (b - y6)^2 - (-x3 + x6)^2 + (-y4 + y5)^2, # eq8
(a - x4)^2 - (-x3 + x4)^2 + (-y4 + y5)^2 - (-y4 + y6)^2, # eq9
-b + x2 + y2, # eq10
a - x2 - y4, # eq11
a - b - x3 + y4, # eq12
]
end;
iniv = BigFloat[1.2, 6.4, 7.6, 8.8, 9.6, 10.8, 2.4, 3.6, 3.2, 5.6, 6.8, 8.8]
res = nls(H, ini=iniv)
return res[1]
end;
たとえば,長方形の長辺,短辺が 11, 10 のとき,小正方形の一辺の長さ(IH)は 3.05287 である。
A = (0, 4.8)
B = (5.2, 3.2)
C = (6.8, 8.4)
D = (1.6, 10)
E = (7.8, 0)
F = (11, 2.6)
G = (8.4, 5.8)
H = (11, 7.4)
I = (9.4, 10)
function draw(a, b, more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(x1, x2, x3, x4, x5, x6, y1, y2, y3, y4, y5, y6) = driver(a, b)
len = sqrt((a - x6)^2 + (b - y5)^2)
@printf("長方形の長辺,短辺が %g, %g のとき,小正方形の一辺の長さ(IH)は %g である。\n", a, b, len)
@printf("A = (%g, %g)\n", 0, y2)
@printf("B = (%g, %g)\n", x2, y1)
@printf("C = (%g, %g)\n", x3, y6)
@printf("D = (%g, %g)\n", x1, b)
@printf("E = (%g, %g)\n", x5, 0)
@printf("F = (%g, %g)\n", a, y3)
@printf("G = (%g, %g)\n", x4, y4)
@printf("H = (%g, %g)\n", a, y5)
@printf("I = (%g, %g)\n", x6, b)
plot([0, a, a, 0, 0], [0, 0, b, b, 0], color=:brown, lw=0.5)
plot!([0, x2, x3, x1, 0], [y2, y1, y6, b, y2], color=:green, lw=0.5)
plot!([x2, x5, a, x4, x2], [y1, 0, y3, y4, y1], color=:red, lw=0.5)
plot!([x4, a, x6, x3, x4], [y4, y5, b, y6, y4], color=:blue, lw=0.5)
if more
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3 # size[2] * fontsize * 2
hline!([0], color=:gray80, lw=0.5)
vline!([0], color=:gray80, lw=0.5)
point(0, y2, " A", :green, :left, delta=-delta)
point(x2, y1, "B ", :green, :right, delta=-delta)
point(x3, y6, " C", :green, :left, :vcenter)
point(x1, b, " D", :green, :left, delta=-delta)
point(x5, 0, "E", :green, :left, :bottom, delta=delta)
point(a, y3, " F", :green, :left, :vcenter)
point(x4, y4, "G", :green, :right, delta=-delta)
point(a, y5, " H", :green, :left, :vcenter)
point(x6, b, "I", :green, :right, delta=-delta)
point(a, b, "(a,b)", :brown, :right, :bottom, delta=delta)
end
end;
draw(11, 10, true)