裏 RjpWiki

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

一夜干しの効果

2023年03月16日 | 雑感

今流行の ChatGPT に聞いてみました

----- 質問

一夜干しすると栄養価が増すなんていうけで,水分が抜けるために,重量比で言えばそうなるというだけじゃないのか?
----- お返事
一夜干しによって栄養価が増すという主張は、完全に正確ではありません。一夜干しによって、食材の重量は減少するため、重量比で栄養価が増すと見えるかもしれませんが、それは栄養価が実際に増加していることを意味しません。

ただし、一夜干しによって、食材の保存期間が延びることがあります。また、一夜干しによって、食材中の水分量が減少するため、重量比で栄養素の濃度が高くなる場合があります。たとえば、乾燥したフルーツは、同じ量の生のフルーツよりも糖分が濃縮されているため、より甘く感じることがあります。

しかし、一夜干しによって栄養素の損失も発生する可能性があるため、必ずしも栄養価が増すわけではありません。また、一夜干しによって微生物の増殖が防止されるため、食中毒のリスクが低くなることがあるため、食材の安全性も向上することがあります。

総合的に考えると、一夜干しによって栄養価が増すという主張は、一般的には正確ではありません。ただし、食材の保存期間や風味、食中毒のリスクなどに影響を与える可能性があるため、適切に行われる場合にはメリットがあることもあります。
----- 終わり

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

怪しい広告

2023年03月16日 | 雑感

糖質低減炊飯器

>「糖質を低減できる」として人気の炊飯器について、国民生活センターは4つのメーカーの製品で「広告表示ほどの効果が無かった」と発表しました。

だよね。なんで,こんなバカバカしい謳い文句に騙されるんだろう。大原則「質量保存の法則」を知らないんだろうね。販売者側も知らなかったとは思えず,消費者を騙そうという魂胆がミエミエ。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

職人の技も,数学を応用すべし。

2023年03月16日 | ブログラミング

今,テレビでやってた。クロワッサンを作るときに,最適なバターの割合をx%からはじめてx+1%にしてとやって,20年かかってやっと最適な割合を見つけたんですって。

ご苦労様でした。二分法を知っていれば,もっと速く最適な割合が見つかったんでしょうにねえ。

数学は偉大だよ。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その168)

2023年03月16日 | Julia

算額(その168)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第20問: 正三角形内に等しい 3 円弧を描き,その中に青円,萌黄円を 3 個ずつ入れる。青円の直径を知って萌黄円の直径を求めよ。

正三角形の頂点を通る円の半径を 1 とし,萌黄円,青円の半径を r1,r2とおく。r1 は簡単に求めることができる。r2 を求め,r1/r2 の比を求める。

using SymPy

@syms r2::positive;
sine = sin(PI/6)
cosine = cos(PI/6)
r0 = 1
xy = r0*sine - r2
x2 = xy*cosine
y2 = xy*sine
eq1 = x2^2 + (y2 + r0)^2 - (1 + r2)^2 |> simplify
eq1 |> println

   3/4 - 4*r2

res = solve(eq1)[1] |> println  # r2

   3/16

x2 |> simplify |> println
y2 |> simplify |> println

   sqrt(3)*(1 - 2*r2)/4
   1/4 - r2/2

r1 = r0 - r0*cosine
r2 = 3//16
r1/r2 |> simplify |> println

   16/3 - 8*sqrt(3)/3

萌黄径 = (16/3 - 8*sqrt(3)/3) × 青径 = 0.714531179816327 × 青径 である。

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function draw(R, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   sine   = sin(PI/6)
   cosine = cos(PI/6)
   r0 = 1
   r1 = r0 - r0*cosine
   r2 = 3//16
   (x2, y2) = (sqrt(Sym(3))*(1 - 2*r2)/4, 1//4 - r2/2)
   println("萌黄径/青径 = $(r1/r2) = $((r1/r2).evalf())")
   plot()
   circle(0, r0/2, r1, :olivedrab1, fill=true)
   circle(r0/2*cosine, -r0/2*sine, r1, :olivedrab1, fill=true)
   circle(-r0/2*cosine, -r0/2*sine, r1, :olivedrab1, fill=true)
   circle(x2, y2, r2, :steelblue1, fill=true)
   circle(-x2, y2, r2, :steelblue1, fill=true)
   circle(0, -sqrt(x2^2 + y2^2), r2, :steelblue1, fill=true)
   circle(r0*cosine, r0*sine, r0, beginangle=150, endangle=270)
   circle(-r0*cosine, r0*sine, r0, beginangle=270, endangle=390)
   circle(0, -r0, r0, beginangle=30, endangle=150)
   plot!([r0*cosine, 0, -r0*cosine, r0*cosine], [-r0*sine, r0, -r0*sine, -r0*sine], color=:black, lw=0.5)
   if more == true
       point(x2, y2, "(x2,y2,r2)", :black, :top)
       point(0, r0/2, " r0/2", :black)
       point(r0*cosine, r0*sine, "", :red)
       point(-r0*cosine, r0*sine, "", :red)
       point(0, -r0, "", :red)
       circle(0, 0, 1, :black)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(123, true)

   萌黄径/青径 = 16/3 - 8*sqrt(3)/3 = 0.714531179816327

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その167)

2023年03月16日 | Julia

算額(その167)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第17問: 外接する 2 個の円と共通接線の間に青と黒の正方形を置く,黃円の径を知って黒の正方形の一辺の長さを求めよ。

図のように青と黒の正方形の右下隅の x 座標を x1, x2,円の半径を r として,連立方程式を解く。

using SymPy

@syms r::positive, x1::positive, x2::positive;

eq1 = (r - x1)^2 + (r - 2x1)^2 - r^2
eq2 = (r - x2)^2 + (r - x2 + x1)^2 - r^2
res = solve([eq1, eq2], (x1, x2))

   4-element Vector{Tuple{Sym, Sym}}:
    (r/5, 2*r/5)
    (r/5, 9*r/5)
    (r, r)
    (r, 2*r)

題意を満たすのは (r/5, 2*r/5) である。r は半径なので,黒の正方形の一辺の長さは黃円の直径の 1/10 である。

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function rect(x1, y1, x2, y2, color=:pink)
   plot!([x1, x2, x2, x1, x1], [y1, y1, y2,  y2, y1], color=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
end;

function draw(R, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r = R / 2
   (x1, x2) = (r/5, 2*r/5)
   plot()
   println("黃径 = $R, 黒一辺 = $(x2 - x1), 青一辺 $(2x1)")
   circle(r, r, r, :yellow, fill=true)
   circle(-r, r, r, :yellow, fill=true)
   rect(-x1, 0, x1, 2x1, :blue)
   rect(x1, 0, x2, x2 - x1, :black)
   rect(-x1, 0, -x2, x2 - x1, :black)
   if more == true
       point(r, r, "(r,r,r)", :black)
       point(x1, 0, "x1", :black, :top)
       point(x2, 0, "x2", :black, :top)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(123, true)

   黃径 = 123, 黒一辺 = 12.3, 青一辺 24.6

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その166)

2023年03月16日 | Julia

算額(その166)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第17問: 長方形内に半円(萌黄)と円弧を描き,その中に赤円と黒円を入れる。赤円と黒円の直径を知って長方形の長い方の一辺の長さを求めよ。

図のように記号を定め,連立方程式を解く。

using SymPy

@syms  r0::positive, r1::positive, r2::positive, r3::positive, x2::positive, x::positive;

r2 = 24
r3 = 17
eq1 = x2^2 + (r0 - 2r1 + r2)^2 - (r0 - r2)^2
eq2 = (x - r3)^2 + (r0 - r3)^2 - (r0 + r3)^2
eq3 = x2^2 + (r1 - r2)^2 - (r1 + r2)^2
eq4 = (r0 - 2r1)^2 + x^2 - r0^2;

res = solve([eq1, eq2, eq3, eq4], (r0, r1, x2, x))

   2-element Vector{NTuple{4, Sym}}:
    (289*sqrt(102)/49 + 11849/196, -17*sqrt(186001 + 19528*sqrt(102))/392 + 289*sqrt(102)/98 + 11849/392, sqrt(-204*sqrt(186001 + 19528*sqrt(102))/49 + 13872*sqrt(102)/49 + 142188/49), 34*sqrt(102)/7 + 408/7)
    (289*sqrt(102)/49 + 11849/196, 17*sqrt(186001 + 19528*sqrt(102))/392 + 289*sqrt(102)/98 + 11849/392, sqrt(204*sqrt(186001 + 19528*sqrt(102))/49 + 13872*sqrt(102)/49 + 142188/49), 34*sqrt(102)/7 + 408/7)

赤円,黒円の径が 24, 17 のとき,長方形の長い方の一辺の長さは (408 + 34√102)/7 = 107.34045255775867 である。
術文では,「黒径 / (1 - sqrt(黒径 / 赤径))」 であるが,SymPy では 「(sqrt(赤径)*黒径^1.5 + 赤径*黒径)/(赤径 - 黒径)」までしか簡単にならない。

(408 + 34√102)/7, (sqrt(r2)*r3^1.5 + r2*r3)/(r2 - r3), r3 / (1 - sqrt(r3 / r2))

   (107.34045255775867, 107.34045255775865, 107.34045255775871)

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r2, r3) = (24, 17)
   (r0, r1, x2, x) = res[1]
   r0 < 2r1 && ((r0, r1, x2, x) = res[2])
   println("r0 = $r0;  r1 = $r1;  x2 = $x2\nx = $x = $(x.evalf())")
   plot()
   circle(0, 0, r0, beginangle=0, endangle=90)
   circle(0, r0 - r1, r1, :olivedrab1, beginangle=270, endangle=450, fill=true)
   circle(x2, r0 - 2r1 + r2, r2, :indianred1, fill=true)
   circle(x - r3, r0 - r3, r3, :snow4, fill=true)
   plot!([0, x, x, 0, 0], [r0 - 2r1, r0 - 2r1, r0, r0, r0 - 2r1], color=:black, lw=0.5)
   if more == true
       point(0, r0, " r0", :black, :left)
       point(0, r0 - r1, " r0-r1", :black, :left)
       point(0, r0 - 2r1, " r0-2r1", :black, :left)
       point(x2, r0 - 2r1 + r2, "(x2,r0-2r1+r2)", :black, :top)
       point(x - r3, r0 - r3, "(x-r3,r0-r3)", :black, :top)
       point(x, r0 - 2r1, " x", :black)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
       plot!(xlims=(0,112), ylims=(50, 125))
   end
end;

draw(false)

   r0 = 289*sqrt(102)/49 + 11849/196;  r1 = -17*sqrt(186001 + 19528*sqrt(102))/392 + 289*sqrt(102)/98 + 11849/392;  x2 = sqrt(-204*sqrt(186001 + 19528*sqrt(102))/49 + 13872*sqrt(102)/49 + 142188/49)
   x = 34*sqrt(102)/7 + 408/7 = 107.340452557759

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その165)

2023年03月15日 | Julia

算額(その165)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第16問: 黄円内に紫正方形と青円,赤円 4 個ずつを入れる。赤円径を知って黃円径を求めよ。

図のように記号を定め,連立方程式を解く。

using SymPy

@syms r1::positive, r2::positive;

eq1 = (1 - r1 - (1 - r2)/sqrt(Sym(2)))^2 + (1 - r2)^2/2 - (r1 + r2)^2
eq2 = (1 - 2r1) / sqrt(Sym(2)) + 2r2 - 1;

res = solve([eq1, eq2])
res |> println

   Dict{Any, Any}[Dict(r1 => -sqrt(2)/2 + sqrt(2)*(-1/4 + sqrt(2)/8 + sqrt(2)*sqrt(19 - 10*sqrt(2))/8) + 1/2, r2 => -1/4 + sqrt(2)/8 + sqrt(2)*sqrt(19 - 10*sqrt(2))/8)]

赤円の半径

res[1][r1] |> simplify |> println
res[1][r1].evalf() |> println

   -3*sqrt(2)/4 + sqrt(19 - 10*sqrt(2))/4 + 3/4
   0.240353914715992

青円の半径

res[1][r2] |> simplify |> println
res[1][r2].evalf() |> println

   -1/4 + sqrt(2)/8 + sqrt(38 - 20*sqrt(2))/8
   0.316402492387137

赤円の半径を知って黃円の半径を知るための係数

1 / res[1][r1] |> simplify |> println
(1 / res[1][r1]).evalf() |> println

   4/(-3*sqrt(2) + sqrt(19 - 10*sqrt(2)) + 3)
   4.16053136135363

赤円の半径を知って青円の半径を知るための係数

res[1][r2] / res[1][r1] |> simplify |> println
(res[1][r2] / res[1][r1]).evalf() |> println

   (-1 + sqrt(2)/2 + sqrt(38 - 20*sqrt(2))/2)/(-3*sqrt(2) + sqrt(19 - 10*sqrt(2)) + 3)
   1.31640249238714

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = -3*sqrt(2)/4 + sqrt(19 - 10*sqrt(2))/4 + 3/4
   r2 = -1/4 + sqrt(2)/8 + sqrt(38 - 20*sqrt(2))/8
   println("r1 = $r1;  r2 = $r2")
   plot()
   circle(0, 0, 1, :yellow, fill=true)
   circle(0, 1 - r1, r1, :tomato1, fill=true)
   circle(0, r1 - 1, r1, :tomato1, fill=true)
   circle(1 - r1, 0, r1, :tomato1, fill=true)
   circle(r1 - 1, 0, r1, :tomato1, fill=true)
   circle((1 - r2)/√2, (1 - r2)/√2, r2, :steelblue1, fill=true)
   circle((1 - r2)/√2, (r2 - 1)/√2, r2, :steelblue1, fill=true)
   circle((r2 - 1)/√2, (1 - r2)/√2, r2, :steelblue1, fill=true)
   circle((r2 - 1)/√2, (r2 - 1)/√2, r2, :steelblue1, fill=true)
   plot!([1-2r1, 0, 2r1-1, 0, 1-2r1], [0, 1-2r1, 0, 2r1-1, 0],
       linecolor=:violet, linewidth=0.5, seriestype=:shape, fillcolor=:violet)
   if more == true
       point(1 - r1, 0, " 1-r1", :black, :left, :bottom)
       point((1-r2)/√2, (1-r2)/√2, "((1-r2)/√2,(1-r2)/√2)", :black, :center, :bottom)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(false)

   r1 = 0.24035391471599188;  r2 = 0.31640249238713725

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その164)

2023年03月15日 | Julia

算額(その164)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第15問: 二等辺三角形に内接する黃円を描き,その間に黒円 1 個と赤円 2 個を入れる。赤円と黒円の直径を知って黃円の直径を求めよ。

二等辺三角形の底辺の長さを 2x,高さを y
黄円の半径と中心座標を r1, (0, r1)
黒円の半径と中心座標を r2, (0, 2r1 + r2)
赤円の半径と中心座標を r3, (x3, y3)
とおき,以下の連立方程式を解く。

一度に解くと有限の時間内に解が求まらないので,逐次解いていく。

include("julia-source.txt")

using SymPy

@syms r1::positive, r2::positive, r3::positive, x3::positive, x::positive, y::positive;

eq1 = x3^2 + (r1 - r3)^2 - (r1 + r3)^2 |> simplify  # 黃円と赤円が外接する
eq2 = dist2(0, y, x, 0, 0, 2r1 + r2, r2)  # 円の中心から斜辺までの距離
eq3 = dist2(0, y, x, 0, 0, r1, r1)  # 円の中心から
eq4 = r3*x - r1*(x - x3);  # 三角形の相似

まず,eq1 を解いて x3 を求める。

ans_x3 = solve(eq1, x3)[1]
ans_x3 |> println

   2*sqrt(r1)*sqrt(r3)

eq4 の x3 に ans_x3 を代入して,x を求める。

eq4 = eq4(x3 => ans_x3)
ans_x = solve(eq4, x)[1]
ans_x |> println

   2*r1^(3/2)*sqrt(r3)/(r1 - r3)

同様にして,eq3 をとき y を求める。

eq3 = eq3(x3 => ans_x3, x=> ans_x);
ans_y = solve(eq3, y)[1]
ans_y |> println

   8*r1^2*r3/(4*r1*r3 - (r1 - r3)^2)

x3, x, y を eq2 に代入して,r1 を求める。

eq2 = eq2(x3 => ans_x3, x=> ans_x, y => ans_y) |> simplify |> numerator |> (x -> x/(16r1^4*r3))
ans_r1 = solve(eq2, r1)[2]
ans_r1 |> println

   2*sqrt(r2)*sqrt(r3) + r3

「黒円の半径と赤円の半径の積の平方根を取り,2 倍して赤円の半径を加える」という,「術」と同じ式が得られる。

以上をまとめると,次のようになる。
r1 = 2sqrt(r2*r3) + r3
y  = 8r1^2*r3/(4r1*r3 - (r1 - r3)^2)
x  = 2r1^(3/2)*sqrt(r3)/(r1 - r3)
x3 = 2*sqrt(r1*r3)

冒頭の図は,黒円と赤円の半径がそれぞれ 2,1 の場合のものである。
黒円の直径が 4,赤円の直径が 2 のとき,黄円の直径は 7.656854249492381 である。
r1 = 3.8284271247461903, x3 = 3.913273373914064, x = 5.296824443579761, y = 16.0321995349166 である。

function draw(r2, r3, more=false)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = 2sqrt(r2*r3) + r3
   y = 8r1^2*r3/(4r1*r3 - (r1 - r3)^2)
   x = 2r1^(3/2)*sqrt(r3)/(r1 - r3)
   x3 = 2sqrt(r1*r3)
   @printf("黒円の直径が %g,赤円の直径が %g のとき,黄円の直径は %g である。\n", 2r2, 2r3, 2r1)
   @printf("r1 = %g;  r2 = %g;  r3 = %g;  x3 = %g;  x = %g;  y = %g\n", r1, r2, r3, x3, x, y)
   plot([x, 0, -x, x], [0, y, 0, 0], color=1, lw=0.5)
   circle(0, r1, r1, :orange)
   circle(0, 2r1 + r2, r2, :black)
   circle2(x3, r3, r3)
   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, r1, " r1", :orange, :left, :vcenter)
       point(0, 2r1 + r2, "2r1+r2", :black, :center, delta=-delta/2)
       point(x3, r3, "(x3,r3)", :red, :center, delta=-delta/2)
       point(x, 0, " x", :blue, :left, :bottom, delta=delta/2)
       point(0, y, " y", :blue, :left, :bottom, delta=delta/2)
   end
end;

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

負の数の平方根(虚数の冪乗)

2023年03月15日 | ブログラミング

-2 の平方根を求めてみる

Python は (-2)**0.5 で求めることができる。しかし,誤差が表示される。虚数単位は j で表される。

>>> (-2)**0.5
(8.659560562354934e-17+1.4142135623730951j)

numpy.sqrt(-2) ではエラーになる。

>>> import numpy as np
>>> np.sqrt(-2)
<stdin>:1: RuntimeWarning: invalid value encountered in sqrt
nan

虚数として与えるとちゃんと計算する。

>>> np.sqrt(-2+0j)
1.4142135623730951j

R ではどうか。

> options(digits=16)
> (-2)^0.5
[1] NaN

> (-2.0+0i)^0.5
[1] 0+1.414213562373095i

Octave はどうか。

>> (-2)^0.5
ans =  8.659560562354932e-17 + 1.414213562373095e+00i

sqrt() は誤差を含まない。

>> sqrt(-2)
ans =                  0 + 1.414213562373095i

Julia では?

julia> (-2)^0.5
ERROR: DomainError with -2.0:
Exponentiation yielding a complex result requires a complex argument.

Replace x^y with (x+0im)^y, Complex(x)^y, or similar.

単にエラーを出すだけではなく,解決方法を提案してくれる。

julia> (-2+0im)^0.5
0.0 + 1.4142135623730951im

sqrt() も,解決方法を提案してくれる。

julia> sqrt(-2)
ERROR: DomainError with -2.0:
sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).

julia> sqrt(Complex(-2))
0.0 + 1.4142135623730951im

 

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その163)

2023年03月14日 | Julia

算額(その163)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第14問: 2 個の紫円を黃円に入れ,その間に 4 個の赤円を入れる。紫円の直径を知って黃円の直径を求めよ。

一般性を失わず黃円の半径を 1 とする。紫円,赤円の径をそれぞれ r1, r2 として連立方程式を解く。

using SymPy

@syms r1::positive, r2::positive;

eq1 = (1 - r2)^2 + (1 - r1)^2 - (r1 + r2)^2
eq2 = r2^2 + (1 - r1)^2 - (r1 - r2)^2

res = solve([eq1, eq2], (r1, r2))
res |> println

   Tuple{Sym, Sym}[(1/8 + sqrt(17)/8, 5/4 - sqrt(17)/4)]

r1 = res[1][1]
r2 = res[1][2];

1/r1 |> simplify |> println  # 紫円 r1 を知って,黃円の径を得るときの倍数

   -1/2 + sqrt(17)/2

r2/r1 |> simplify |> println  # 紫円 r1 を知って,赤円 r2 の径を得るときの倍数

   -11/4 + 3*sqrt(17)/4

1/r2 |> simplify |> println  # 赤円 r2 を知って,黃円の径を得るときの倍数

   sqrt(17)/2 + 5/2

r1/r2 |> simplify |> println  # 赤円 r2 を知って,紫円 r1 の径を得るときの倍数

   11/8 + 3*sqrt(17)/8

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2) = res[1]
   println("r1 = $r1 = $(r1.evalf())\nr2 = $r2 = $(r2.evalf())")
   plot()
   circle(0, 0, 1, :yellow, fill=true)
   circle(0, 1 - r1, r1, :orchid1, fill=true)
   circle(0, r1 - 1, r1, :orchid1, fill=true)
   circle(r2, 0, r2, :tomato1, fill=true)
   circle(-r2, 0, r2, :tomato1, fill=true)
   circle(1 - r2, 0, r2, :tomato1, fill=true)
   circle(r2 - 1, 0, r2, :tomato1, fill=true)
   circle(0, 1 - r1, r1, :orchid3)
   circle(0, r1 - 1, r1, :orchid3)
   if more == true
       point(0, 1 - r1, " 1-r1", :black)
       point(r2, 0, "r2", :black, :top)
       point(1 - r2, 0, "1-r2", :black, :top)
       point(1, 0, " 1", :black, :left, :top)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

   r1 = 1/8 + sqrt(17)/8 = 0.640388203202208
   r2 = 5/4 - sqrt(17)/4 = 0.219223593595585

 

 

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その162)

2023年03月14日 | Julia

算額(その162)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第13問: 長方形内に正三角形と青円 2 個,赤円を入れる。青円の直径を知って,赤円の径を求めよ。

青円の半径とその中心の x 座標を r1,x1 として方程式を解く。r1 = 1 として一般性を失わない。

using SymPy

function distance(x1, y1, x2, y2, x0, y0)
   p1, p2 = sympy.Point(x1, y1), sympy.Point(x2, y2)
   l = sympy.Line(p1, p2)
   l.distance(sympy.Point(x0, y0))^2  # 二乗距離を返す!!
end;

@syms r1::positive, r2::positive, x1::positive;
r1 = 1
eq1 = x1^2 + (r1-r2)^2 - (r1+r2)^2  # 青円と赤円が外接する
eq2 = distance((2r1 - 2r2)/sqrt(Sym(3)), 0, 0, 2r1 - 2r2, x1, r1) - r1^2  # 青円が正三角形の斜辺に接する

res = solve([eq1, eq2], (x1, r2))
res |> println

   Tuple{Sym, Sym}[(sqrt(3)*(-123*sqrt(3) - 60*(3 - 3*sqrt(3)/2)^2 + 8*(3 - 3*sqrt(3)/2)^3 + 231)/12, 3 - 3*sqrt(3)/2)]

res[1][1] |> simplify |> println  # x1
res[1][2] |> simplify |> println  # r2

   3 - sqrt(3)
   3 - 3*sqrt(3)/2

赤円の径は青円の径の 3 - 3*√3/2 倍である。

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function draw(more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r1 = 1
   (x1, r2) = ((3 - √3)r1, (3 - 3*√3/2)r1)
   println("青円径 = $r1, 赤円径 = $r2;  x1 = $x1")
   plot([x1 + r1, x1 + r1, -x1 - r1, -x1 - r1, x1 + r1], [0, 2r1, 2r1, 0, 0], color=:black, lw=0.5)
   circle(0, 2r1 - r2, r2, :orangered, fill=true)
   circle(x1, r1, r1, :steelblue1, fill=true)
   circle(-x1, r1, r1, :steelblue1, fill=true)
   plot!([(2r1-2r2)/√3, 0, -(2r1-2r2)/√3, (2r1-2r2)/√3], [0, 2r1 - 2r2, 0, 0],
         linecolor=:olivedrab1, linewidth=0.5, seriestype=:shape, fillcolor=:olivedrab1)
   if more == true
       point(x1, r1, "C:(x1,r1)", :black, :center)
       point(0, 2r1 - r2, " 2r1-r2", :black)
       point(0, 2r1 - 2r2, " A:2r1-2r2", :black)
       point((2r1-2r2)/√3, 0, " B:(2r1-2r2)/√3", :black, :center, :bottom)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

   青円径 = 1, 赤円径 = 0.401923788646684;  x1 = 1.2679491924311228

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その161)

2023年03月13日 | Julia

算額(その161)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第12問: 黒円に外接する 3 個の赤円に 3 個の黃円が外接している。赤円と黒円の直径を知って黃円の直径を求めよ。

黒,赤,黃の円の半径を r1, r2, r3 とする。また,黃円の中心座標を (x3, y3) とし,連立方程式を解く。

using SymPy

@syms r1::positive, r2::positive, r3::positive, x3::positive, y3::positive;
eq1 = x3 - (r1 + r3) * cos(PI/6)
eq2 = y3 - (r1 + r3) * sin(PI/6)
eq3 = x3^2 + (r1 + r2 - y3)^2 - (r2 + r3)^2;  # 赤円と黃円が外接

res = solve([eq1, eq2, eq3], (r3, x3, y3))
res |> println

   Tuple{Sym, Sym, Sym}[(-r1*(r1 + r2)/(r1 - 3*r2), -2*sqrt(3)*r1*r2/(r1 - 3*r2), -2*r1*r2/(r1 - 3*r2))]

黃円の半径は -r1*(r1 + r2)/(r1 - 3*r2) つまり,「黒円の半径の二乗に黒円の半径と赤円の半径をかけたものを加え,赤円の半径の 3 倍から黒円の半径を引いたもので割る」。

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function draw(R2, R1, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2) = (R1, R2) ./ 2
   (r3, x3, y3) = (-r1*(r1 + r2)/(r1 - 3*r2), -2*sqrt(3)*r1*r2/(r1 - 3*r2), -2*r1*r2/(r1 - 3*r2))
   println("r3 = $r3;  x3 = $x3;  y3 = $y3")
   plot()
   println("黃円径 = $(2r3);  黒円径 = $R1;  赤円径 = $R2")
   circle(0, 0, r1, :snow4, fill=true)
   circle(0, r1 + r2, r2, :indianred1, fill=true)
   circle((r1 + r2)√3/2, -(r1 + r2)/2, r2, :indianred1, fill=true)
   circle(-(r1 + r2)√3/2, -(r1 + r2)/2, r2, :indianred1, fill=true)
   circle(x3, y3, r3, :khaki1, fill=true)
   circle(-x3, y3, r3, :khaki1, fill=true)
   circle(0, -r1 - r3, r3, :khaki1, fill=true)
   if more == true
       point(0, r1, " r1", :white)
       point(0, r1 + r2, " r1+r2", :white)
       point(x3, y3, "(x3,y3,r3)", :black)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(2, 2.3, false)

   r3 = 1.3364864864864863;  x3 = 2.153360463464009;  y3 = 1.243243243243243
   黃円径 = 2.6729729729729725;  黒円径 = 2.3;  赤円径 = 2

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その160)

2023年03月13日 | Julia

算額(その160)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第11問: 二等辺三角形とその頂点を通る大円と接する赤円と小円がある。大円と赤円の直径を知って小円の直径を求めよ。

小円,大円,赤円の半径を r1, r2, r3, 大円の中心座標を (x3, y3) とし,方程式を立て解く。

using SymPy

@syms r1::positive, r2::positive, r3::positive;
eq1 = (r2 - 2r3) / r2 - r1 / (r1 + 2r2);
res = solve(eq1, r1)[1] |> expand
res |> println

   r2^2/r3 - 2*r2

小円の直径は「大円の直径の二乗を赤円の直径で割り,大円の直径の2倍を引く」ことで求まる。

その他,図を描くために以下の計算をする。θは二等辺三角形の頂角の半分である。

sinθ = (r2 - 2r3) / r2
cosθ = sqrt(1 - sinθ^2)
x3 = (r2 - r3)*cosθ
y3 = (r2 - r3)*sinθ + r2 + 2r2;

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function draw(R2, R3, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r2, r3) = (R2, R3) ./ 2
   r1 = r2^2/r3 - 2*r2
   sinθ = (r2 - 2r3) / r2
   cosθ = sqrt(1 - sinθ^2)
   x3 = (r2 - r3)*cosθ
   y3 = (r2 - r3)*sinθ + r2 + 2r1
   x0 = 2(r1 + r2)*sinθ/cosθ
   plot()
   println("小円径 = $(2r1);  大円径 = $R2;  赤円径 = $R3)")
   circle(0, r2 + 2r1, r2, :black)
   circle(x3, y3, r3, :tomato1, fill=true)
   circle(-x3, y3, r3, :tomato1, fill=true)
   circle(0, r1, r1)
   plot!([x0, 0, -x0, x0], [0, 2(r1 + r2), 0, 0], color=1, lw=0.5)
   if more == true
       point(0, r1, " r1")
       point(0, 2r1 + r2, " 2r1+r2", :black)
       point(x3, y3, "(x3,y3,r3)", :white, :center, :bottom)
       point(x0, 0, "   x0", :black, :center, :bottom)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(4.3, 2, false)

   小円径 = 0.6449999999999996;  大円径 = 4.3;  赤円径 = 2)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その159)

2023年03月13日 | Julia

算額(その159)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第9問: 紫と赤の円 2 個ずつで青円 2 個と黒円を挟む。黒円,青円の直径を知って赤円の直径を求めよ。

黒,青,赤,紫の円の半径を r1, r2, r3, r4 として,紫の円が黒,青,赤の円に外接することについて連立方程式を解く。

using SymPy

@syms r1::positive, r2::positive, r3::positive, r4::positive;
eq1 = (r1 + r4)^2 + (r1 + r2)^2 - (r2 + r4)^2;
eq2 = (r1 + r4)^2 + (r1 + 2r2 + r3)^2 - (r3 + r4)^2;
res = solve([eq1, eq2], (r3, r4))[1]

   (r2^3/(r1^2 + r1*r2 - r2^2), -r1*(r1 + r2)/(r1 - r2))

赤半径= 青半径^3 / (黒半径^2 + 黒半径*青半径 - 青半径^2) である。
十分綺麗な式になっているが術文では「黒径/青径 を極とおき,赤径 = 青径/(極(極+1)-1)」としている。

using Plots

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function draw(R1, R2, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2) = (R1, R2) ./ 2
   (r3, r4) = (r2^3/(r1^2 + r1*r2 - r2^2), -r1*(r1 + r2)/(r1 - r2))
   plot()
   println("黒径 = $R1;  青径 = $R2, 赤径 = $(2r3), 紫径 = $(2r4)")
   circle(0, 0, r1, :black, fill=true)
   circle(0, r1+r2, r2, :deepskyblue, fill=true)
   circle(0, -r1-r2, r2, :deepskyblue, fill=true)
   circle(0, r1+2r2+r3, r3, :tomato1, fill=true)
   circle(0, -r1-2r2-r3, r3, :tomato1, fill=true)
   circle(r1+r4, 0, r4, :violet, fill=true)
   circle(-r1-r4, 0, r4, :violet, fill=true)
   if more == true
       point(0, r1, "r1", :white, :center, :top)
       point(0, r1+r2, "r1+r2", :white, :center, :top)
       point(0, r1+2r2+r3, "r1+2r2+r3", :white, :center, :top)
       point(r1+r4, 0, "r1+r4", :white, :center, :top)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(1, 1.3, false)

   黒径 = 1;  青径 = 1.3, 赤径 = 3.601639344262298, 紫径 = 7.666666666666665

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

算額(その158)

2023年03月13日 | Julia

算額(その158)

岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF

第10問: 直角三角形内に互いに接する 3 個の円を入れる円の直径を知って直角三角形の直角を挟む長い方の一辺(股)の長さを求めよ。

3 個の円の中心は正三角形を構成する。図において,⊿ADE と ⊿ABC は相似であり BC = 3√3r,BX = 2r, CG = r ゆえ FG = 3(1+√3)r である。したがって,「円の直径を知って」ということであれば,股の長さは円の直径の 3(1+√3)/2 = 4.098076211353316 倍である。術文では √(6.75) + 1.5 倍と書いてあるが。

図を描くためにわざわざ SymPy を使ってみる。

using SymPy

function distance(x1, y1, x2, y2, x0, y0)
   p1, p2 = sympy.Point(x1, y1), sympy.Point(x2, y2)
   l = sympy.Line(p1, p2)
   l.distance(sympy.Point(x0, y0))^2  # 二乗距離を返す!!
end;

@syms r::positive, x::positive, y::positive;

eq1 = distance(x, 0, 0, y, r, 3r) - r^2
eq2 = sqrt(Sym(3))y - x;

res = solve([eq1, eq2], (x, y))

   2-element Vector{Tuple{Sym, Sym}}:
    (r*(-1 + 3*sqrt(3)), r*(9 - sqrt(3))/3)
    (3*r*(1 + sqrt(3)), r*(sqrt(3) + 3))

using Plots
using Printf

function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
   θ = beginangle:0.1:endangle
   x = r.*cosd.(θ)
   y = r.*sind.(θ)
   if fill
       plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
   else
       plot!(ox .+ x, oy .+ y, color=color, linewidth=0.5)
   end
end;

function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
   mark && scatter!([x], [y], color=color, markerstrokewidth=0)
   annotate!(x, y, text(string, 10, position, color, vertical))
end;

function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
   plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;

function draw(R, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r = R/2
   (x, y) = (3*r*(1 + sqrt(3)), r*(sqrt(3) + 3))
   println("股の長さ = $x, 円の直径 = $R")
   plot([0, 0, -x, 0], [0, y, 0, 0], color=:black, lw=0.5)
   circle(-r, 3r, r, :blue, fill=true)
   circle(-r, r, r, :blue, fill=true)
   circle(-(1+√3)r, 2r, r, :blue, fill=true)
   if more == true
       point(-r, 3r, " A", :white)
       point(-(1+√3)r, 2r, "D ", :white, :right, :bottom)
       point(-r, r, "", :white)
       point(-(1+3√3)r, 0, "B ", :green, :right, :bottom)
       point(-r, 2r, " E", :white, :left, :bottom)
       point(-3(1+√3)r, 0, "X", :green, :right, :bottom)
       point(-r, 0, " C", :white, :left, :bottom)
       point(0, 0, " G", :black, :left, :bottom)
       point(0, x/√3, " Y", :black, :left)
       segment(-r, 3r, -(3√3+1)r, 0)
       segment(-r, 3r, -r, 0)
       segment(-(1+√3)r, 2r, -r, 2r)
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
   else
       plot!(showaxis=false)
   end
end;

draw(1, false)

   股の長さ = 4.098076211353316, 円の直径 = 1

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

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

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