裏 RjpWiki

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

算額(その1410)

2024年11月20日 | ブログラミング

算額(その1410)

百五十一 群馬県前橋市下大屋町 産泰神社 年代不明
群馬県和算研究会:群馬の算額,上武印刷株式会社,高崎市,1987年3月31日.

桜沢門人 武州幡羅郡三箇尾村 権田源之助正賢
山口正義:やまぶき2 第37号,2016年6月20日.
https://yamabukiwasan.sakura.ne.jp/ymbk37.pdf

キーワード:円12個,外円,正三角形3個
#Julia, #SymPy, #算額, #和算

外円の中に甲円 1 個,乙円 2 個を容れる。甲円,乙円の中には正三角形を容れ,さらに甲円の中には丙円と等円,乙円の中には 3 個ずつの等円を容れる。外円の直径が 9 寸のとき,等円の直径はいかほどか。

注:本問と関連する算額を「算額(その1411)」に掲示する。違いは甲円の中にある丙円の位置と大きさである。

外円の中の甲円と乙円の位置と大きさについて
外円の半径と中心座標を R, (0, )
甲円の半径と中心座標を r1, (0, R - r1)
乙円の半径と中心座標を r2, (r2, y2)
等円の半径を r
とおき,以下の方程式を解く。

(1) 甲円の中の正三角形と丙円,等円の大きさについては,「算額(その593)」に示したように,甲円の中にある等円の直径は甲円の直径の 1/6 である。r = r1/6

(2) 乙円の中の正三角形と等円の大きさについては,「算額(その918)」に示したように,乙円の中にある等円の直径は乙円の直径の 1/4である。 r = r2/4

よって,r2 = 2r1/3 である。外円の中に甲円と乙円が入っているので,以下の連立方程式を解いて甲円と乙円の半径と中心座標を求める。

include("julia-source.txt");
# julia-source.txt ソース https://blog.goo.ne.jp/r-de-r/e/ad3a427b84bb416c4f5b73089ae813cf
@syms R, r, r1, r2, y2
eq1 = 3r2 - 2r1
eq2 = r2^2 + y2^2 - (R - r2)^2
eq3 = r2^2 + (R - r1 - y2)^2 - (r1 + r2)^2
res = solve([eq1, eq2, eq3], (r1, r2, y2))[2]  # 2 of 3

    (R*(-4 + sqrt(21)), 2*R*(-4 + sqrt(21))/3, R*(-2 + sqrt(21)/3))

甲円の半径 r1 は外円の半径 R の (√21 - 4) 倍,乙円の半径 r2 は外円の半径 R の (√21 - 4)*2/3 倍である。
甲円の中にある等円の半径は外円の半径 R の (√21 - 4)/6 倍,乙円の中にある等円の半径は外円の半径 R の (√21 - 4)*2/3/4 = (√21 - 4)/6 倍でで等しくなる。

問のように外円の直径が 9 寸のとき,等円の直径は 9*(√21 - 4)/6 = 0.8738635424337597 寸となる。

R = 4.5;  r1 = 2.62159;  r2 = 1.74773;  y2 = -2.12614
甲円の直径 = 5.2431812546025585,丙円の直径 = 1.3107953136506396,甲円の中にある等円の直径 = 0.8738635424337597
乙円の直径 = 3.495454169735039,乙円の中にある等円の直径 = 0.8738635424337597

おかしいですね。
答,術は「外円径を 9 で割れば,等円の直径が得られる。」すなわち,「外円径が 9寸ならば,等円径は 1 寸」のはず。

実は同じような算額が他に 2 件あるのは承知していた(その 2 件の算額の内容は同じ)。(時系列とは逆に)たまたまこちらを先に解いた。
似ている算額について,次の記事「算額(その1411)」を書く。

ここまで書いてきて,だいぶ前に読んだ記事にあった図(山口)を思い出した。再確認した所,「図の写し間違いだろう」という指摘も同じであった。

function draw_sub(sw, x, y, r, color, color2, color3)
    circle(x, y, r, color)
    (x1, y1) = r .* (cosd(30), -sind(30))
    plot!(x .+ [x1, 0, -x1, x1], y .+ [y1, r, y1, y1], color=color2, lw=0.5)
    if sw == 1
        circle(x, y, r/2, color2)
        circle(x, y + (r/2 + r/6), r/6, color3)
        println("甲円の直径 = $(2r),丙円の直径 = $(r/2),甲円の中にある等円の直径 = $(2r/6)")
    else
        for deg in (30, 150, 270)
            circle(x + 3r/4*cosd(deg), y + 3r/4*sind(deg), r/4, color3)
        end
        sw == 2 && println("乙円の直径 = $(2r),乙円の中にある等円の直径 = $(2r/4)")
    end
end

function draw(R, more)
    pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
    (r1, r2, y2) = (R*(-4 + sqrt(21)), 2*R*(-4 + sqrt(21))/3, R*(-2 + sqrt(21)/3))
    @printf("R = %g;  r1 = %g;  r2 = %g;  y2 = %g\n", R, r1, r2, y2)
    plot()
    circle(0, 0, R)
    # circle(0, R - r1, r1, :orange)
    draw_sub(1, 0, R - r1, r1, :green, :chartreuse3, :darkorange)
    # circle2(r2, y2, r2, :blue)
    draw_sub(2, r2, y2, r2, :blue, :darkblue, :darkorange)
    draw_sub(3, -r2, y2, r2, :blue, :darkblue, :darkorange)
    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, R, "R", :red, :center, :bottom, delta=delta)
        point(0, R - r1, "甲円:r1,(0,R-r1)", :green, :center,:bottom, delta=delta/2)
        point(0, R - r1, "丙円:r1/2,(0,R-r1)", :tomato, :center, delta=-delta/2, mark=false)
        point(0, R - r1/3, "等円:r1/6,(0,R-r1/3)", :tomato, :center, delta=-delta/2)
        point(r2, y2, "乙円:r2,(r2,y2)", :blue, :center, delta=-delta/2)
        point(r2, y2 - 3r2/4, "等円:r2/4\n(r2,y2-3r2/4)", :darkorange, :left, delta=-8delta/2, deltax=4delta)
        point(2.1, 0, "r1 = R*(√21 - 4)\nr2 = 2r1/3", :black, :left, :vcenter, deltax=-0.5delta, mark=false)

    end
end;

draw(9/2, true)

 

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

算額(その1389)

2024年11月03日 | ブログラミング
算額(その1389)
 
番外九 武州 慈恩寺
埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.
キーワード:球5個,外球,3 次元,ソディ・ゴセットの n+1 球定理
#Julia, #SymPy, #算額, #和算
 
外球の中に小球を 4 個容れる。外球の直径が 1 寸のとき,小球の直径はいかほどか。
1. ソディ・ゴセットの n+1 球定理による解答
 
算額(その1374)で用いた方法である。
 
外球の半径を R,小球の半径を r とおき,以下の方程式をとき r を求める。
 
using SymPy
 
@syms r::positive, R::positive
eq = 3(4(1/r^2) + 1/R^2) - (4/r - 1/R)^2;
 
solve(eq, r)[1] |> println
 
   R*(-2 + sqrt(6))
 
小球の半径 r は,外球の半径 R の (√6 - 2) 倍である。
外球の直径が 1 寸のとき,小球の直径は √6 - 2 = 0.4494897427831779 寸である。
 
答えは「4分4厘有奇」と正確とは言い難いが,術は「6 の平方根から 2 を引いて外球の直径を掛ける」とあるので正確である。誤差の主原因は √6 に不正確な近似値 2.44 を使用しためであろうか。2.44 - 2 =0.44
 
s6 = 2.44
s6 - 2
 
   0.43999999999999995
 
2. 基礎的なところから計算する解答
 
半径が r の 4 つの小球の中心は,一辺が a = 2r の正四面体の頂点である。
小球が内接する外球の半径 R は、各球の中心から正四面体の重心までの距離に加え、各球の半径を加えることで求められる。
 
1. 一辺の長さが a の四面体において,重心から各頂点までの距離 d は
    d = sqrt(3/8)*a
2. 内接する球の半径 R
    R = d + r
      = sqrt(3/8)*a + r
      = sqrt(3/8)*2r + r
      = (sqrt(3/8)*2 + 1)*r
         = (1 + √6/2)*r
   3. また,小球の半径 r
       r = R/(sqrt(3/8)*2 + 1)
         = (√6 - 2)*R
 
外球の半径が R = 0.5 のとき,小球の半径は r = √6 - 2 = 0.22474487139158905
直径はその 2 倍の 2*0.22474487139158905 = 0.4494897427831781 である。

 

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

Julia で統計解析 2024/7/18 版

2024年07月18日 | ブログラミング

Julia で統計解析

2024/7/18 にバージョンアップ

https://r-de-r.github.io/stats/Julia-stats1.html
https://r-de-r.github.io/stats/Julia-stats2.html
https://r-de-r.github.io/stats/Julia-stats3.html
https://r-de-r.github.io/stats/Julia-stats4.html
https://r-de-r.github.io/stats/Julia-stats5.html
https://r-de-r.github.io/stats/Julia-stats6.html
https://r-de-r.github.io/stats/Julia-stats7.html
https://r-de-r.github.io/stats/Julia-stats8.html
https://r-de-r.github.io/stats/Julia-stats9.html

 

第 1 章 Julia の実行環境

1. 必要なファイルをダウンロードする
2. Julia のインストール
3. Julia を起動し終了する
4. 作業ディレクトリを変える
5. Julia の環境設定をする
5.1. startup.jl ファイルがあるかを確認
5.2. config がなかった場合
5.3. startup.jl がある場合
5.4. 変更内容の確認
6. オンラインヘルプを使う
7. パッケージを利用する
8. エディタを使う
8.1. Atom
8.2. Jupyter lab
9. 結果を保存する

第 2 章 データの入出力

1. データをデータフレームへ読み込む
1.1. Excel のワークシートファイル
1.2. CSV ファイル
1.2.1. 典型的な CSV ファイル
1.2.2. 一般の CSV ファイル
1.2.3. CSV.read の引数
1.3. インターネット上の CSV ファイル
1.4. モニター上に表示された表をデータフレームに読み込む
1.5. クリップボードにコピーした内容をデータフレームにする
1.6. 文字列行から入力する
1.7. エンコーディングの違うファイルを読む
1.8. デリミタで区切られていない固定書式ファイルを読む
2. データフレームを CSV ファイルに書き出す
2.1. CSV.write の引数

第 3 章 データフレームの取り扱い

1. データを使用するための準備
1.1. 既存のデータを使用する
1.2. 自前のデータ
2.  データフレームの概要
2.1. データフレームの大きさ
2.2. データフレームの変数名
2.3. データフレームの表示
3. データフレームのコピーは copy()  で
4. 空データフレーム
5. データフレームの列の参照
6. データフレームの行の参照
7. データフレームの列名の変更
8. 列の抽出
9. 指定された列を削除する
10. 行の抽出
11. 行の削除
12. 重複を除き,ユニークな行のみを含むデータフレームを作る
13. 欠損値を含む行か含まない行か
14. 欠損値を含まない行を抽出する
15. データフレームの列方向連結
16. データフレームの行方向連結
16.1. cols = :setequal, cols=:orderequal
16.2. cols = :intersect
16.3. cols = :subset
16.4. cols = :union
17. データフレームの最終行の次に 1 行追加する
18. 行を繰り返してデータフレームを作る
19. データフレームに列を挿入する
20. データフレームの要素から新しいデータフレームを作る
21. データフレームの各列に関数を施す
22. ソート(並べ替え)
22.1. ソートされているかをチェックする
22.2. ソートの順番を決める
22.3. 並べ替えベクトルを返す
23. 行の包含
23.1. df1 と df2 のすべての組み合わせを作る crossjoin
23.2. df1 の行のうち,df2 に含まれない行を抽出する antijoin
23.3. df1 に,df2 をマージする innerjoin
23.4. df1 に,df2 をマージする leftjoin
23.5. df1 に,df2 をマージする outerjoin
23.6. df2 に,df1 をマージする rightjoin
23.7. 両方に存在する項目のみでマージする semijoin
24. 欠損値のリストワイズ除去
25. ロングフォーマット(縦長データフレーム)に変換する
26. ワイドフォーマット(横長データフレーム)に変換する
27. データフレームをグループ変数に基づいて分割する
27.1. グループ分けされたデータフレームを抽出する
27.2. グループ化されたデータフレームに関する情報
27.3. 親データフレームを返す
28. 列ごとに関数を適用する
29. 行ごとに関数を適用する
30. クエリーによる操作例
30.1. 要素に関数を適用する @map コマンド
30.2. 条件を満たす行を抽出 @filter コマンド
30.3. データフレームのグループ化 @groupby コマンド
30.4. データのソート @orderby,@orderby_descenidng,@thenby,@thenby_descending コマンド
30.5. データフレームのマージ @groupjoin コマンド
30.6. データフレームの連結 @join コマンド
30.7. キーと値のペアを展開 @mapmany コマンド
30.8. 要素を取り出す @take コマンド
30.9. 要素を捨てる @drop コマンド
30.10. 重複データを除く @unique コマンド
30.11. 列の選択 @select コマンド
30.12. 列名の変更 @rename コマンド
30.13. 変数変換 @mutate コマンド
30.14. 欠損値行を除く @dropna コマンド
30.15. 欠損値を含まないデータフレーム @dissallowna コマンド
30.16. 欠損値の置き換え @replacena コマンド
31. データフレームを二次元配列に変換する

第 4 章 一変量統計

1. 一変量統計
1.1. 一変数の場合
1.1.1. 基礎統計量
1.1.2. パーセンタイル値
1.1.3. 度数分布
1.2. 複数の変数の場合
1.2.1. eachcol() を使う
1.2.2. describe() を使う
1.2.3. combine(), select()/select!(), transform()/transform!() を使う
1.3. グループごとの記述統計量
1.3.1. describe() を使う
1.3.2. 変数ごとに統計量を一覧表示
2. 二変量統計
2.1. 二重クロス集計表
2.2. 相関係数,共分散
2.2.1. 欠損値を含まない場合
2.2.1.1. それぞれの関数を使う
2.2.1.2. combine() を使う
2.2.2. 欠損値を含む場合
2.2.2.1. それぞれの関数を使う
2.2.2.2. combine() を使う
2.3. 相関係数行列,分散・共分散行列
2.3.1. 欠損値を含まない場合
2.3.2. 欠損値を含む場合
3. 多変量統計
3.1. 多重クロス集計表

第 5 章 離散データの可視化

1. 例示に使用するデータセット
1.1. カテゴリーデータ
2. 棒グラフ
2.1. 一標本の場合
2.2. 二標本以上の場合
2.2.1. 横に並べる棒グラフ
2.2.2. 積み上げ棒グラフ
2.3. 複数のグラフを行列状にまとめて表示する方法
3. 帯グラフ
4. モザイクプロット
5. バルーンプロット

第 6 章 数値データの可視化

1. ヒストグラム
1.1. 一標本の場合
1.2. 複数標本の場合
2. ボックスプロット(箱ひげ図)
3. バイオリンプロット
4. ドットプロット
5. カーネル密度推定の描画
6. Q-Q プロット
7. 散布図
8. カーネル密度推定
9. 散布図行列
10. 作図レシピ
10.1. 二軸グラフ
10.2. Andrews plot
10.3. 星座グラフ
10.4. サンフラワープロット
10.5. レーダーチャート

第 7 章 検定と推定

1. 検定関数関数の呼び出し方
2. 検定関数関数により得られる結果の利用法
3. 分布の検定
3.1. 観察度数が一様かどうかの検定
3.1.1. ピアソンの \\chi^2 検定
3.1.2. 対数尤度比検定(G^2 検定)
3.2. 観察度数が理論比に從うかどうかの検定
3.2.1. ピアソンの \\chi^2 検定
3.2.2. 対数尤度比検定(G^2 検定)
4. 独立性の検定
4.1. ピアソンの \\chi^2 検定
4.2. 対数尤度比検定(G^2 検定)
5. パワーダイバージェンス検定
6. フィッシャーの正確検定
7. 二項検定
8. t 検定
8.1. 一標本の検定(母平均の検定)
8.2. 等分散の場合の t 検定
8.3. 等分散でない場合 Welch の方法
9. マン・ホイットニーの U 検定
10. 符号検定
11. ウィルコクソンの符号付き順位和検定
12. 相関係数の検定
13. 対応のない k 標本(独立 k 標本)
13.1. 一元元配置分散分析
13.2. 一元元配置分散分析(ウェルチの方法)
13.3. クラスカル・ウォリス検定
14. コルモゴロフ・スミルノフ検定
14.1. 1 標本の分布の検定
14.2. 2 標本の分布の差の検定
15. アンダーソン・ダーリング検定
15.1. 1 標本の場合
15.2. k 標本の場合
16. ワルド・ウォルフォビッツ連検定
17. 並べ替え検定(無作為検定)

第 8 章 多変量解析

1. 回帰分析
1.1. 線形最小二乗回帰 Linear Least Square
1.1.1. 単回帰分析
1.1.2. 重回帰分析
1.2. リッジ回帰 Ridge Regression
1.2.1. 説明変数が 1 個の場合
1.2.2. 説明変数が 2 個以上の場合
1.3. GLM パッケージによる回帰分析
1.3.1. 重回帰分析 Ordinary Least Squares Regression
1.3.2. プロビット回帰 Probit Regression
1.3.3. ロジット回帰 Logit Regression
1.4. 多項式回帰
1.4.1. 重回帰プログラムを用いる
1.4.2. 多項式回帰 Polynomials パッケージ
1.5. 指数回帰
1.5.1. 説明変数が 1 個の場合
1.5.2. 説明変数が 2 個以上の場合
1.6. 累乗回帰
1.6.1. 説明変数が 1 個の場合
1.6.2. 説明変数が 2 個以上の場合
1.7. 非線形回帰
2. 判別分析
2.1. 二群判別分析
2.2. 多重判別分析
3. 主成分分析
4. 因子分析
5. 古典的多次元尺度解析
6. クラスター分析
6.1. K-means 法による非階層的クラスター分析
6.2. 階層的クラスター分析
7. カテゴリー変数の取り扱い方
7.1. 重回帰分析の場合
7.2. 判別分析の場合

第 9 章 関数

 

 

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

モンテカルロ法で,解析解のチェック

2024年06月24日 | ブログラミング

 一辺の長さが R の正方形の中に,半径 R の四分円 2 個と,半径 r の円を描く。

四分円と円の隙間(緑の点が散らばっている領域)の面積をモンテカルロ法により求める。

1000000 個の点を打って,領域内に入った点の割合から面積を推定すると,0.172231*R^2 となった。解析解は 0.17239838239331384*R^2 だったので,解析解を導いた式は間違っていなさそうだ。

using Random, Distributions, StatsBase
R = 1
r = 3R/8
n = 1000000
x = rand(Uniform(0.5, 1.0), n)
y = rand(Uniform(0, 1.0), n)
z = @. (x^2 + y^2 < R^2) && ((x - R/2)^2 + (y - r)^2 > r^2)
2*(R^2/2 * mean(z))

   0.172231

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

(2 * 3 * 5 * 7 * 11 * 13)**10 は何桁の数か?

2024年06月04日 | ブログラミング

こちらにも投稿しておこう。

受験生は log10(2), log10(3) は知っているとの前提で

import math

もともとの数値

(2 * 3 * 5 * 7 * 11 * 13)**10

    596421543032951827553785377955490490000000000

それは知らない(わからない)ことにしておいて,

10 乗する数は

2 * 3 * 5 * 7 * 11 * 13

    30030

まず,30030 よりほんの少し小さい数を 2, 3, 5 のべき乗の積で作る

2 * 4 * 4 * 5 * 10 * 16, 2**8 * 100

    (25600, 25600)

25600**10 の常用対数を取る

10*(8*math.log10(2) + 2)

    44.0823996531185

次に,30030 よりほんの少し大きい数を 2, 3, 5 のべき乗の積で作る

2 * 4 * 4 * 6 * 10 * 16, 2**10 * 3 * 10

    (30720, 30720)

30720**10 の常用対数を取る

10*(10*math.log10(2) + math.log10(3) + 1)

    44.87421211359475

3 つの数値は,同じ桁数になったようだ...

(2 * 3 * 5 * 7 * 11 * 13)**10 の常用対数は 25600 の常用対数より大きく, 30720 の常用対数より小さい

10*(8*math.log10(2) + 2) < math.log10((2 * 3 * 5 * 7 * 11 * 13)**10) < math.log10((2**10 * 3 * 10)**10)

    True

さらに,桁数は同じ 45 桁である。

10*(8*math.log10(2) + 2), math.log10((2 * 3 * 5 * 7 * 11 * 13)**10), math.log10((2**10 * 3 * 10)**10)

    (44.0823996531185, 44.77555332198981, 44.874212113594744)

 

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

算額(その946)

2024年05月12日 | ブログラミング

算額(その946)

一〇六 神川村新里 光明寺 大正3年(1914)

埼玉県立図書館:埼玉県史料集 第二集『埼玉の算額』,昭和44年,誠美堂印刷所,埼玉県与野市.

日円,月円,地円,星円が互いに外接しあっている。日円,月円,地円の直径がそれぞれ 3 寸,2 寸,1 寸のとき,星円の直径はいかほどか。

日円の半径と中心座標を r1, (0, r1)
月円の半径と中心座標を 2r, (0, r1 + 2r4 + r2)
星円の半径と中心座標を r3, (x3, y3)
地円の半径と中心座標を r4, (0, r1 + r4)
とおき,以下の連立方程式を解く。

include("julia-source.txt");

@syms r1::positive, r2::positive,
     r3::positive,  x3::positive, y3::positive,
     r4::positive
eq1 = x3^2 + y3^2 - (r1 + r3)^2
eq2 = x3^2 + (r1 + 2r4 + r2 - y3)^2 - (r2 + r3)^2
eq3 = x3^2 + (r1 + r4 - y3)^2 - (r4 + r3)^2
res = solve([eq1, eq2, eq3], (r3, x3, y3))[2]  # 2 of 2

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

星円の半径は r4*(r1 + r4)*(r2 + r4)/(r1*r2 - r4^2) である。
日円,月円,地円の直径がそれぞれ 3 寸,2 寸,1 寸のとき,星円の直径は 2.4 寸である。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2, r4) = (3, 2, 1) ./ 2
   (r3, x3, y3) = (r4*(r1 + r4)*(r2 + r4)/(r1*r2 - r4^2), 2*sqrt(r1)*sqrt(r2)*r4*sqrt(r1 + r4)*sqrt(r2 + r4)/(r1*r2 - r4^2), (r1^2*r2 + r1*r2*r4 - r2*r4^2 - r4^3)/(r1*r2 - r4^2))
   @printf("日円,月円,地円の直径がそれぞれ %g 寸,%g 寸,%g 寸のとき,星円の直径は %g 寸である。\n", 2r1, 2r2, 2r4, 2r3)
   @printf("r1 = %g;  r2 = %g;  r4 = %g;  r3 = %g;  x3 = %g;  y3 = %g\n", r1, r2, r4, r3, x3, y3)
   plot()
   circle(0, 0, r1)
   circle(0, r1 + 2r4 + r2, r2, :blue)
   circle(0, r1 + r4, r4, :magenta)
   circle2(x3, y3, r3, :green)
   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, 0, "日円:r1,(0,0)", :red, :center, delta=-delta/2)
       point(0, r1 + 2r4 + r2, "月円:r2,(0,r1+2r4+r2)", :blue, :center, delta=-delta/2)
       point(0, r1 + r4, "地円:r4\n(0,r1+r4)", :magenta, :center, :bottom, delta=delta/2)
       point(x3, y3, "星円:r3,(x3,y3)", :green, :center, delta=-delta/2)
   end
end;

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

算額(その940)

2024年05月10日 | ブログラミング

算額(その940)

福岡県朝倉市上秋月(旧甘木市秋月町) 秋月八幡宮絵馬堂 明治7年(1874)
「算額」第三集 全国調査,香川県算額研究会

外円に内接する正五角形に一本の対角線を引き,中円と小円を入れる。中円と小円の直径が与えられたとき,対角線の長さを求めよ。

外円の大きさを確定するために必要なのは中円の直径だけであり,小円は無関係である。

算額(その937)の一部分で,求めるものが違うだけである。

座標の定義に使う三角関数の値
(x18, y18) = (cosd(18), sind(18))
(x54, y54) = (cosd(54), sind(54))

正五角形が内接する外円の半径と中心座標を R, (0, 0)
中円の半径と中心座標を r1,(2r1*x18, 2r1*y18)
とおき,以下の方程式より R を得る。

外円の半径は中円の半径の (1 + √5) 倍である。

include("julia-source.txt");

@syms x18::positive, y18::positive, x54::positive, y54::positive
(x18, y18) = (cosd(Sym(18)), sind(Sym(18)))
(x54, y54) = (cosd(Sym(54)), sind(Sym(54)));

@syms R::positive, r1::positive
eq1 = dist2(0, R, R*x54, -R*y54, 2r1*x18, 2r1*y18, r1)
R = solve(eq1, R)[1] |> sympy.sqrtdenest |> simplify
R |> println

   r1*(1 + sqrt(5))

外円の半径が R のとき,求める対角線の長さは RE = AB = 2R*cosd(18)である。

最終的に,

中円の半径が 6.5 のとき,R = 6.5*(1 + sqrt(5)),RE = 2 * 6.5*(1 + sqrt(5)) * cosd(18) = 40.00988598327829 である。

2 * 6.5*(1 + sqrt(5)) * cosd(18)

   40.00988598327829

function draw(more=false)
   pyplot(size=(600, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (x18, y18) = (cosd(18), sind(18))
   (x54, y54) = (cosd(54), sind(54))
   r1 = 6.5
   (x1, y1) = 2r1.*(x18, y18)
   R = r1*(1 + √5)
   l = 2 * r1*(1 + sqrt(5)) * cosd(18)
   println("中円の直径が $(2r1) のとき,対角線の長さは $l")
   x = R .* [x18, 0, -x18, -x54, x54, x18]
   y = R .* [y18, 1, y18, -y54, -y54, y18]
   plot(x, y, color=:blue, lw=0.5)
   circle(0, 0, R, :gray70)
   segment(0, R, R*x54, -R*y54, :green)
   circle(2r1*x18, 2r1*y18, r1)
   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(R*x18, R*y18, " A", :black, :left, :vcenter)
       point(-R*x18, R*y18, "B ", :black, :right, :vcenter)
       point(R*x54, -R*y54, " E", :black, :left, :vcenter)
       point(0, R, " R", :blue, :left, :bottom, delta=delta/2)
       point(R*x18, R*y18, "(R*x18,R*y18)  ", :blue, :right, :bottom, delta=delta/2)
       point(R*x54, -R*y54, " (R*x54,-R*y54)   ", :blue, :right, :bottom, delta=delta/2)
       point(2r1*x18, 2r1*y18, "甲円:r1\n(2r1*x18,2r1*y18)", :red, :center, delta=-delta/2)
       plot!(xlims=(-1.1R*x18, 1.1R*x18))
   end
end;

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

算額(その920)

2024年05月06日 | ブログラミング

算額(その920)

香川県善通寺市与北町 皇美屋神社 明治11年(1878)
本田益夫:算額随想-香川県内の算額について-,私家版,昭和45年(1970).

直線上に大円 2 個,小円 3 個,内円 1 個が積み上がっている。大円,小円の直径がそれぞれ 14 寸,7 寸のとき,内円の直径はいかほどか。

大円の半径と中心座標を r1, (r1, r1)
小円の半径と中心座標を r2, (r2, y2), (0, y22)
内円の半径と中心座標を r3, (0, y3)
とおき,以下の連立方程式を解く。

大円,小円の直径が特定の値のときには,直接数値を代入して連立方程式を解けばよい。

include("julia-source.txt");

using SymPy
@syms r1::positive, r2::positive, y2::positive, y22::positive,
     r3::positive, y3::positive
(r1, r2) = (14, 7) .// 2
eq1 = (r1 - r2)^2 + (y2 - r1)^2 - (r2 + r1)^2
eq2 = r1^2 + (y3 - r1)^2 - (r3 + r1)^2
eq3 = r2^2 + (y2 - y3)^2 - (r2 + r3)^2
eq4 = r2^2 + (y22 - y2)^2 - 4r2^2;
res = solve([eq1, eq2, eq3, eq4], (y2, y22, r3, y3))[2]  # 2 of 2

   (7 + 7*sqrt(2), 7*sqrt(3)/2 + 7 + 7*sqrt(2), 2, 4*sqrt(2) + 7)

大円,小円の直径がそれぞれ 14 寸,7 寸のとき,内円の直径は 4 寸である。

---

以下では,一般解を求める。

@syms r1::positive, r2::positive, y2::positive, y22::positive,
     r3::positive, y3::positive
eq1 = (r1 - r2)^2 + (y2 - r1)^2 - (r2 + r1)^2 |> expand
eq2 = r1^2 + (y3 - r1)^2 - (r3 + r1)^2 |> expand
eq3 = r2^2 + (y2 - y3)^2 - (r2 + r3)^2 |> expand
eq4 = r2^2 + (y22 - y2)^2 - 4r2^2 |> expand;

y2, y3 は簡単に求めることができる。

println(eq1, " から y2 を求める")
ans_y2 = solve(eq1, y2)[2]  # 2 of 2
ans_y2 |> println

   r1^2 - 4*r1*r2 - 2*r1*y2 + y2^2 から y2 を求める
   2*sqrt(r1)*sqrt(r2) + r1

println(eq2, " から y3 を求める")
ans_y3 = solve(eq2, y3)[2]  # 2 of 2
ans_y3 |> println

   r1^2 - 2*r1*r3 - 2*r1*y3 - r3^2 + y3^2 から y3 を求める
   r1 + sqrt(r3)*sqrt(2*r1 + r3)

r3 は,上で求めた y2, y3 を eq3 に代入し,方程式を解けばよい。もう少し簡約化することもできるが,大差ない。

eq13 = eq3(y2 => ans_y2, y3 => ans_y3) |> expand
println(eq13, " から r3 を求める")
ans_r3 = solve(eq13, r3)[1]
ans_r3 |> println

   -4*sqrt(r1)*sqrt(r2)*sqrt(r3)*sqrt(2*r1 + r3) + 4*r1*r2 + 2*r1*r3 - 2*r2*r3 から r3 を求める
   2*(-2*sqrt(2)*r1^(3/2)*r2^(3/2) + r1*r2*(r1 + r2))/(r1^2 - 6*r1*r2 + r2^2)

y22 は eq4 を解き,式中の y2 に,すでに求めた ans_y2 を代入すればよい。

println(eq4, " から y22 を求める")
ans_y22 = solve(eq4, y22)[2]
ans_y22(y2 => ans_y2) |> simplify |> println

   -3*r2^2 + y2^2 - 2*y2*y22 + y22^2 から y22 を求める
   2*sqrt(r1)*sqrt(r2) + r1 + sqrt(3)*r2

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   (r1, r2) = (14, 7) .// 2
   r3 = 2*(-2√(2(r1^3*r2^3)) + r1*r2*(r1 + r2))/(r1^2 - 6*r1*r2 + r2^2)
   y3 = r1 + √(2r1*r3 + r3^2)
   y2 = r1 + 2√(r1*r2)
   y22 = 2√(r1*r2) + r1 + √3r2
   plot()
   circle2(r1, r1, r1)
   circle2(r2, y2, r2, :blue)
   circle(0, y22, r2, :blue)
   circle(0, y3, r3, :green)
   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(r1, r1, "大円:r1,(r1,r1)", :red, :center, delta=-delta/2)
       point(r2, y2, "小円:r2,(r2,y2)", :blue, :center, delta=-delta/2)
       point(0, y22, "小円:r2,(0,y22)", :blue, :center, delta=-delta/2)
       point(0, y3, "内円:r3,(0,y3)", :black, :center, delta=-delta/2)
       segment(-2r1, 0, 2r1, 0, :magenta, lw=0.5)
   end
end;

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

算額(その855)

2024年04月13日 | ブログラミング

算額(その855)

三十 岩手県一関市山ノ目 配志和神社 嘉永5年(1848)

山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市. http://www.wasan.jp/yamamura/yamamura.html

正方形内に直径が 1 寸の 4 個の等円を入れる。赤で示した部分の面積を求めよ。

正方形の一辺の長さを 2a,等円の半径を r とおくと,正方形の一辺の長さは等円の直径の 1 + √2 倍である。

include("julia-source.txt");

using SymPy

@syms a, r
eq = (2r)^2 - 2(a - r)^2
a = solve(eq, a)[2]
a |> println

   r*(1 + sqrt(2))

赤積は,点 (0, 0), (a, 0), (a, a - r), (a - r, a - r) を結んでできる台形の面積から,緑で示した等円の面積の 45/360 と,赤で示した等円の面積の 135/360 を引いたものである。

赤積 = 2((a + r)*(a - r)/2 - pi*r^2*(1/8 + 135/360)) = (a^2 - r^2) - pi*r^2

r = 1/2 のとき,a = 1 + √2 なので,赤積 = 0.4217086177890992 である。

r = 1/2
a = r*(1 + sqrt(2))
(a^2 - r^2) - pi*r^2

   0.4217086177890992

また,緑の等円の(上側の)方程式 f(x) と 赤の等円の(下側)の方程式 g(x) について積分することで,赤積を求めることもできる。
当然ながら両者は一致する。

@syms r, a, x, f, g
r = 1//2
a = r*(1 + √Sym(2))

f = sqrt(r^2 - x^2)
S1 = integrate(f, (x, r/√(Sym(2)), r));
S1 |> println

g = -sqrt(r^2 - (x - (a - r))^2) + (a - r)
S2 = integrate(g, (x, r/√(Sym(2)), a));
S2 |> println

S = S2 - S1
S |> println

2S.evalf() |> println

   -1/16 + pi/32
   -5/16 - 3*pi/32 + sqrt(2)*(1/2 + sqrt(2)/2)/2
   -pi/8 - 1/4 + sqrt(2)*(1/2 + sqrt(2)/2)/2
   0.421708617789099

念の為,GeoGebra で図形を描き,面積を多角形で近似すると,ほぼ同じ数値になることを確かめた。

答曰も,術曰も赤積は 0.884 有奇としているが,明白な誤りである。
0.7854 は円積率で,0.7854 * 4 は円周率に極めて近い数値なのであるが,ほかは何を計算しているのだろうか。

(sqrt(0.75) + 1 - 0.7854 * 1.25) |> println
sqrt(0.75) + 1 |> println
0.7854 * 4 |> println
0.7854 * 1.25 |> println
1.866 - 0.98175 |> println

   0.8842754037844386
   1.8660254037844386
   3.1416
   0.98175
   0.8842500000000001

function draw(more=false)
   pyplot(size=(500, 500), showaxis=true, grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r = 1//2
   a = r*(1 + sqrt(2))
   赤積 = 2((a + r)*(a - r)/2 - pi*r^2*(1/8 + 135/360))
   println("赤積 = $赤積")
   plot([a, a, -a, -a, a], [-a, a, a, -a, -a], color=:blue, lw=0.5)
   circle4(a - r, a - r, r)
   circle(0, 0, r)
   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(a, 0, " a", :blue, :left, :bottom, delta=delta/2)
       point(0, a, " a", :blue, :left, :bottom, delta=delta/2)
       point(a - r, a - r, "等円:r,(a-r,a-r)", :red, :center, delta=-delta/2)
       point(r/√2, r/√2, " (r/√2,r/√2)", :red, :left, :vcenter)
       point(r, 0, " r", :red, :left, delta=-delta/2)
   end
end;

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

算額・和算ページのまとめ(2)

2024年03月24日 | ブログラミング

神壁算法

  1. 算額(その771)
    https://blog.goo.ne.jp/r-de-r/e/d86f8eafad5635b089840548e2577bfb
  2. 算額(その770)
    https://blog.goo.ne.jp/r-de-r/e/28303bccaf422cc2177040e433f30ab2
  3. 算額(その769)
    https://blog.goo.ne.jp/r-de-r/e/1fde4dc2613ad46677b38c699f071794
  4. 算額(その697)
    https://blog.goo.ne.jp/r-de-r/e/ab7929468b8b6664735d652fee031327
  5. 算額(その696)
    https://blog.goo.ne.jp/r-de-r/e/6b46a88a2e9e196cf9e0c035d3794167
  6. 算額(その695)
    https://blog.goo.ne.jp/r-de-r/e/5ce9b6cd24b57fd7d01497b6aa9a1331
  7. 算額(その694)
    https://blog.goo.ne.jp/r-de-r/e/d8227dd71b21273a0effe1e59029b573
  8. 算額(その693)
    https://blog.goo.ne.jp/r-de-r/e/61cdf4ecbf7104c1f85b9f86e3079710
  9. 算額(その692)
    https://blog.goo.ne.jp/r-de-r/e/1b3e7a7043254fc1b5c573ba784967f8
  10. 算額(その691)
    https://blog.goo.ne.jp/r-de-r/e/17c7f558bedea88e621af02d3541043f
  11. 算額(その690)
    https://blog.goo.ne.jp/r-de-r/e/30af0ab7a44f52601537b571991c8fac
  12. 算額(その689)
    https://blog.goo.ne.jp/r-de-r/e/4ae4441cff6e545596ad2a364157d53d
  13. 算額(その687)
    https://blog.goo.ne.jp/r-de-r/e/ebbd04fd41bc039e531d8e67f0eea1ae
  14. 算額(その686)
    https://blog.goo.ne.jp/r-de-r/e/20fbf15bdacfff2a94c780f3cf0fa0f3
  15. 算額(その650)
    https://blog.goo.ne.jp/r-de-r/e/141375a967a505289641a98d59bd5f58
  16. 算額(その649)
    https://blog.goo.ne.jp/r-de-r/e/a89c101131a973c5fcd4bd2c2b31feaf
  17. 算額(その575)
    https://blog.goo.ne.jp/r-de-r/e/36a7228a5c3c1b7ae0189f08334ed5e3
  18. 算額(その447)
    https://blog.goo.ne.jp/r-de-r/e/e3b4d9e0d5fdc6c578c6925d586b183d

続神壁算法

  1. 算額(その792)
    https://blog.goo.ne.jp/r-de-r/e/5fc1e2f9b4eeee6953c3cce3295a5fc0
  2. 算額(その791)
    https://blog.goo.ne.jp/r-de-r/e/d74e1016f980b8f6556f77af065a2b52
  3. 算額(その790)
    https://blog.goo.ne.jp/r-de-r/e/dbb15ebd39534aeb3b00793f7d864dc3
  4. 算額(その789)
    https://blog.goo.ne.jp/r-de-r/e/c1965824c3ffb56527ca0f472779b132
  5. 算額(その788)
    https://blog.goo.ne.jp/r-de-r/e/19175b3fed4b6ba45257a043104d7a49
  6. 算額(その787)
    https://blog.goo.ne.jp/r-de-r/e/01ca15ba267aea8104461af6a02a4afe
  7. 算額(その446)
    https://blog.goo.ne.jp/r-de-r/e/0743744b8d4a5067267df6f06f239e8b
  8. 算額(その445)
    https://blog.goo.ne.jp/r-de-r/e/9f35b3c1b37302b50c61355f43956949
  9. 算額(その444)
    https://blog.goo.ne.jp/r-de-r/e/62b830b5a07cbc2f693a80ab9d29d1e0
  10. 算額(その443)
    https://blog.goo.ne.jp/r-de-r/e/08f51fefb42a8dc2a610944e746bc186
  11. 算額(その442)
    https://blog.goo.ne.jp/r-de-r/e/6cad986da6c2eaad06db77453c767746
  12. 算額(その441)
    https://blog.goo.ne.jp/r-de-r/e/7effc64587864aa350523addf0442972
  13. 算額(その440)
    https://blog.goo.ne.jp/r-de-r/e/59a28abd7846fcf2d0cb8e257673a330
  14. 算額(その439)
    https://blog.goo.ne.jp/r-de-r/e/8a2c65a3828a2ca879d7fb5b86444a12
  15. 算額(その438)
    https://blog.goo.ne.jp/r-de-r/e/5411ee85b446d73ca00e82a2e26be622
  16. 算額(その437)
    https://blog.goo.ne.jp/r-de-r/e/7d06276e0130f0c09bb89c49d1fc668d
  17. 算額(その436)
    https://blog.goo.ne.jp/r-de-r/e/25ceda8b47f762c54a441ebd059cd781
  18. 算額(その394)
    https://blog.goo.ne.jp/r-de-r/e/10fe593496313a52b495d0080109b0c1

神壁算法追加

  1. 算額(その515)
    https://blog.goo.ne.jp/r-de-r/e/894cc97a5779e7592d5f0a58cabf578e
  2. 算額(その514)
    https://blog.goo.ne.jp/r-de-r/e/548cd85b7970aa08c54aa0cfc63cc96d

 

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

算額(その700)

2024年02月16日 | ブログラミング

算額(その700)

埼玉の算額ほか
https://gunmawasan.web.fc2.com/files/saitama-sangaku-h24.html
愛宕神社の復元算額 明治13年(部分拡大図)(加須市)
https://gunmawasan.web.fc2.com/files/sangak-corner/atago-3s.jpg

正方形の中に四分円 2 個,大円,小円それぞれ 2 個ずつ入っている。小円の直径が 1 寸のとき,大円の直径はいかほどか。

正方形の一辺の長さを 2a
大円の半径と中心座標を r1, (r1, r1)
小円の半径と中心座標を r2, (a - r2, y2)
とおき,以下の連立方程式を解く

include("julia-source.txt");

using SymPy
@syms a::positive, r1::positive, r2::positive, y2::positive

eq1 = r2^2 + y2^2 - (2a - r2)^2
eq2 = (r1 + a)^2 + r1^2 - (2a - r1)^2
eq3 = (2a - r2)^2 + y2^2 - (2a + r2)^2
res = solve([eq1, eq2, eq3], (a, r1, y2))

   1-element Vector{Tuple{Sym, Sym, Sym}}:
    (3*r2, 3*r2*(-3 + 2*sqrt(3)), 2*sqrt(6)*r2)

大円の半径は,小円の半径の (6√3 - 9) 倍である。
小円の直径が 1 寸の場合,大円の直径は 6√3 - 9 = 1.392304845413264 寸である。

その他のパラメータは以下のとおりである。

a = 1.5;  r1 = 0.696152;  y2 = 2.44949

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   r2 = 1//2
   (a, r1, y2) = (3*r2, 3*r2*(-3 + 2*sqrt(3)), 2*sqrt(6)*r2)
   @printf("大円の直径 = %g;  a = %g;  r1 = %g;  y2 = %g\n", 2r1, a, r1, y2)
   plot([a, a, -a, -a, a], [0, 2a, 2a, 0, 0], color=:magenta, lw=0.5)
   circle(a, 0, 2a, :blue, beginangle=90, endangle=180)
   circle(-a, 0, 2a, :blue, beginangle=0, endangle=90)
   circle(r1, r1, r1)
   circle(-r1, r1, r1)
   circle(a - r2, y2, r2, :green)
   circle(r2 - a, y2, r2, :green)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       hline!([0], color=:black, lw=0.5)
       vline!([0], color=:black, lw=0.5)
       point(a, 0, " a", :magenta, :left, :bottom, delta=delta/2)
       point(0, 2a, " 2a", :magenta, :left, :bottom, delta=delta/2)
       point(r1, r1, "大円:r1,(r1, r1)", :red, :center, delta=-delta/2)
       point(a - r2, y2, "小円:r2,(a-r2,y2)", :green, :center, delta=-delta/2)
   end
end;

 

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

算額(その685)

2024年02月08日 | ブログラミング

算額(その685)

和算問題あれこれ 2 令和5年2月の問題-No.4(『算法求積通考』第6問)
https://gunmawasan.web.fc2.com/k-n-mondai.html

長径 2 寸,短径 1 寸の楕円形の周は何寸か。
小数点以下 4 位を四捨五入し,小数点以下 3 位まで答えよ。
円周率は 3.14159 を使用のこと。

コンピュータを使って正確な値を求めるならば,第二種完全楕円積分を使えばよい。
計算するためのパッケージ(ライブラリ)が用意されているのでそれを使えばよい。あるいは,区分求積法を使ってもよいし,逐次計算により求めてもよい。

しかし,今回のように要求される精度がほどほどに指定されている場合には,いくつかの近似式があるので精度に基づいて選択すればよい。

以下では,楕円のパラメータとして,長半径 a,短半径 b を使う。
長半径,短半径は長径,短径の半分である。

a = 2//2   # 長径 2
b = 1//2;  # 短径 1

まずは,関孝和の近似式

2sqrt(4(a - b)^2 + 3.14159^2*a*b)

    4.872286471072899

第二種完全楕円積分の近似式で,Gauss-Kummer の公式

h = (a - b)/(a + b)
3.14159*(a + b)*(1 + (h/2)^2 + h^4/64 + h^6/256)

    4.844218858908822

同じく近似式でシュリニヴァーサ・アイヤンガー・ラマヌジャンの近似式

3.14159*(3(a + b) - sqrt((3a + b)*(a + 3b)))

    4.844206457106038

名前が似ているが,もう少し精度が高いらしい,シュリニヴァーサ・ラマヌジャンの近似式

3.14159* (a + b)*(1 + 3*((a - b)/(a + b))^2/(10 + sqrt(4 - 3*((a - b)/(a + b))^2)))

    4.844220016323984

残念ながら,関孝和の近似式はちょっと精度が足りないが,他の近似公式では「小数点以下 4 位を四捨五入し,小数点以下 3 位まで答えよ」の要件を満たし,4.844 を与える。

なお,第二種完全楕円積分を用いた正確な値は 4.844224110273837 である

using Elliptic
m = 1.0 - (b / a)^2             # 楕円の離心率を計算
println(4 * a * ellipke(m)[2])  # 楕円の周長を計算(第二種完全楕円積分)

    4.844224110273837

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

算額(その666)

2024年01月31日 | ブログラミング

算額(その666)

長野市元善町 善光寺 寛政8年(1796)
中村信弥「改訂増補 長野県の算額」(p.52)

http://www.wasan.jp/zoho/zoho.html

三角形の中に全,大,中,小の正方形が入っている。底辺の長さが 48 寸,中正方形,小正方形の一辺の長さがそれぞれ,6寸,3寸のとき,大正方形の一辺の長さはいかほどか。

図のように記号を定め,相似比,正方形の一辺の長さについての連立方程式を解く。

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,
     y1::positive, y2::positive, y3::positive, y4::positive,
     a::positive, b::positive, h::positive
a = 48
y1 = 6
eq1 = y1/x1 - h/b
eq2 = (y2 - y1)/(x2 - x1) - h/b
eq3 = (y3 - y2)/(x3 - x2) - h/b
eq4 = (h - y3)/(b - x3) - h/b  # 従属
eq5 = (h - y3)/(x4 - b) - h/(a - b)
eq6 = (y3 - y2)/(x5 - x4) - h/(a - b)
eq7 = (y2 - y4)/(x6 - x5) - h/(a - b)
eq8 = y4/(a - x6) - h/(a - b)  # 従属
eq9 = x2 - x1 - 6
eq10 = x5 - x2 - y2
eq11 = x6 - x5 - y4
eq12 = x4 - x3 - 3
eq13 = y3 - y2 - 3
res = solve([eq1, eq2, eq3, eq5, eq6, eq7, eq9, eq10, eq11, eq12, eq13],
   (x1, x2, x3, x4, x5, x6, y2, y3, y4, b, h))

   1-element Vector{NTuple{11, Sym}}:
    (6, 12, 15, 18, 24, 32, 12, 15, 8, 16, 16)

x1 = 6;  x2 = 12;  x3 = 15;  x4 = 18;  x5 = 24;  x6 = 32
y1 = 6;  y2 = 12;  y3 = 15;  y4 = 8;  a = 48;  b = 16;  h = 16
大正方形の一辺の長さ =x6-x5 = y4 = 8 である。

function draw(more=false)
   pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
   a = 48
   y1 = 6
   (x1, x2, x3, x4, x5, x6, y2, y3, y4, b, h) = (6, 12, 15, 18, 24, 32, 12, 15, 8, 16, 16)
   @printf("x1 = %g;  x2 = %g;  x3 = %g;  x4 = %g;  x5 = %g;  x6 = %g\n",
       x1, x2, x3, x4, x5, x6)
   @printf("y1 = %g;  y2 = %g;  y3 = %g;  y4 = %g;  a = %g;  b = %g;  h = %g\n",
       y1, y2, y3, y4, a, b, h)
   @printf("大正方形の一辺の長さ(x6-x5 = y4) = %g\n", y4)
   plot([0, a, b, 0], [0, 0, h, 0], color=:black, lw=0.5)
   rect(x1, 0, x2, y1, :blue)
   rect(x2, 0, x5, y2, :blue)
   rect(x3, y2, x4, y3, :blue)
   rect(x5, 0, x6, y4, :blue)
   if more
       delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3  # size[2] * fontsize * 2
       vline!([0], color=:black, lw=0.5)
       hline!([0], color=:black, lw=0.5)
       vline!([x1, x2, x3, x4, x5, x6, b], color=:gray20, lw=0.1)
       hline!([y1, y2, y3, y4], color=:gray20, lw=0.1)
       point.([x1, x2, x3, x4, x5, x6, b], 0,
           ["x1", "x2", "x3", "x4", "x5", "x6", "b"],
           :blue, :center, delta=-2delta)
       point.(0, [y1, y2, y3, y4],
           ["y1 ", "y2 ", "y3 ", "y4 "],
           :blue, :right, :vcenter)
       point((x2 + x5)/2, y2/2, "全", :red, :center, :vcenter, mark=false)
       point((x5 + x6)/2, y4/2, "大", :red, :center, :vcenter, mark=false)
       point((x1 + x2)/2, y1/2, "中", :red, :center, :vcenter, mark=false)
       point((x3 + x4)/2, (y2 + y3)/2, "小", :red, :center, :vcenter, mark=false)
       point(a, 0, "a", :black, delta=-2delta)
       point(b, h, "(b,h)", :black, :center, :bottom, delta=2delta)
       plot!(xlims=(-3, 50), ylims=(-3, 19))
   end
end;

 

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

macOS で「R と RStudio を超簡単に GUI でインストールする」方法

2023年11月23日 | ブログラミング
ChatGPT

macOSでRとRStudioをGUIで簡単にインストールする方法はいくつかあります。以下はその一例です。なお、手順やダウンロード先の情報は変更される可能性があるため、最新の情報を確認することをお勧めします。

1.  Rのインストール

まず、Rをインストールします。

  • R 公式ウェブサイト: https://cran.r-project.org/mirrors.html

    • ウェブサイトにアクセスし、ページ中央部の「Download and Install R」セクションから最新のRをダウンロードします。
    • ダウンロードが完了したら、.pkgファイルを実行してRをインストールします。

2.  RStudioのインストール

次に、RStudioをインストールします。

  • RStudio 公式ウェブサイト: https://www.rstudio.com/products/rstudio/download/

    • ウェブサイトにアクセスし、ページ中央部の「RStudio Desktop」セクションから最新のRStudioをダウンロードします。
    • ダウンロードが完了したら、.dmgファイルを実行してRStudioをインストールします。

注意事項

  • インストールの際には、システムの管理者パスワードが必要な場合がありますので、用意しておいてください。
  • インストールが完了したら、RとRStudioを起動して正しく動作するか確認してください。

これで、GUIを使用して簡単にRとRStudioをmacOSにインストールすることができます。

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

ダサいプログラム

2023年07月05日 | ブログラミング

某氏のプログラムで(プログラミング言語は何だっていい,言わんとしていることはわかるだろう)

switch mat_ver
case 1
  mat_name='R2019a';
case 2
  mat_name='R2007b';
case 3
  mat_name='ver7.1';
case 4
  mat_name='ver5.3';
end

というような類似部分が,何箇所もある。簡明直截ではあるが,ダサい

name  = ['R2019a', 'R2007b', 'ver7.1', 'ver5.3']
mat_name = name[mat_ver]

でいいじゃないか。

更には,中間変数なんぞも不要で,

mat_name = ['R2019a', 'R2007b', 'ver7.1', 'ver5.3'][mat_ver]

のほうが,どれだけわかりやすいか。

こういうプログラムを書く人は信用ならん。

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

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

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