裏 RjpWiki

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

算額(その3)

2022年10月27日 | Julia

算額(その3)

一点で接する半径の等しい弧がある。その弧にはさまれて,それぞれの弧に接し,また隣の円に接するような円を順々に作る。最初の円の直径を四寸,次は五寸とする。黒い部分(最小の円と両弧の間)の面積を最大にした場合,円をいくつはさむことができるか。

「黒い部分(最小の円と両弧の間)の面積を最大にした場合」というのはいらないのではないか?

  • i 番目の円の半径 ri,中心座標 (xi, 0)
  • i+1 番目の円の半径 rip1,中心座標 (xip1, 0)
  • 円の半径を r,中心座標を (0, r) とする。その円の一部が「弧」

using SymPy
@syms r, ri, rip1, xi, xip1, r1::positive, r2::positive, x1::positive, x2::positive

   (r, ri, rip1, xi, xip1, r1, r2, x1, x2)

中心座標と半径の関係

xpi1 - xi = rip1 + ri

xpi1 - xi - rip1 - ri = 0 …… (1)

弧が i 番目の円と接することから

(r + ri)^2 = r^2 + xi^2

xi = sqrt(2r * ri + ri^2)
xip1 = sqrt(2r * rip1 + rip1^2) …… (2)

(1) に (2) を代入

a = sqrt(2r * rip1 + rip1^2) - sqrt(2r * ri + ri^2) - rip1 - ri
a |> println

   -ri - rip1 - sqrt(2*r*ri + ri^2) + sqrt(2*r*rip1 + rip1^2)

rip1 について解く。解が円の半径の漸化式になる。

b = solve(a, rip1)[1];
b |> println

   ri*(r + ri + sqrt(ri*(2*r + ri)))/(r - ri - sqrt(ri*(2*r + ri)))

一番小さい円の半径を r1,2 番目に大きい円の半径 r2 とする。

eq1 = (r + r1)^2 - r^2 - x1^2;
eq2 = (r + r2)^2 - r^2 - x2^2;
eq3 = x2 - x1 - r2 - r1;

results = solve([eq1, eq2, eq3], (x1, x2, r));

r1 = 4, r2 = 5 が与えられているので,弧を持つ円の半径は 720 である。

results[1][3](r1 => 4, r2 => 5) |> println

   720

---

using Plots

# 次に大きい円の半径
f(ri, r) = ri*(r + ri + sqrt(ri*(2*r + ri)))/(r - ri - sqrt(ri*(2*r + ri)))

function circle2(ox, oy, r; color=:red)
   theta = 0:0.01:2pi
   x = r.*cos.(theta)
   y = r.*sin.(theta)
   plot!(ox .+ x, oy .+ y, color=color)
end;

function draw(r1, r2)
   r = 4*r1*r2*(r1 + r2)/(r1 - r2)^2
   println("r = $r")
   gr(size=(500, 500), aspectratio=1, label="", fontfamily="IPAMincho")
   plot()
   circle2(0, r, r, color=:black)
   circle2(0, -r, r, color=:black)
   ri = r1
   maxr, maxx = r1, 0
   no = 0
   while r - ri - sqrt(ri*(2*r + ri)) >= 0
       x = sqrt((r + ri)^2 - r^2)  # 半径 ri の円の中心の x 座標
       maxx = max(x, maxx)
       maxr = max(ri, maxr)
       no += 1
       println("$no: x = $x, r = $ri,  $(ri + sqrt(ri*(2*r + ri)))")
       circle2(x, 0, ri)
       plot!([0, 0], [ri, 0], color=:blue)
       ri = f(ri, r)  # その次に大きい円の半径
   end
   println(maxx/maxr)
   plot!(xlims=(0, maxx + maxr), ylims=(-maxr, maxr),
         size=(500, 500 * 2maxr / (maxx + maxr)))
   savefig("$r1-$r2.png")
end

答え:9個の円が存在する

draw(4, 5)

   r = 720.0
   1: x = 76.0, r = 4,  80.0
   2: x = 85.0, r = 5.0,  90.0
   3: x = 96.42857142857166, r = 6.428571428571429,  102.85714285714286
   4: x = 111.42857142857119, r = 8.571428571428573,  120.00000000000001
   5: x = 132.0, r = 12.000000000000002,  144.0
   6: x = 162.0, r = 18.000000000000004,  180.0
   7: x = 210.0, r = 30.000000000000007,  240.00000000000003
   8: x = 300.0, r = 60.000000000000014,  360.0
   9: x = 540.0, r = 180.00000000000003,  720.0
   2.9999999999999996

その他の例

draw(5, 6)

   r = 1320.0
   1: x = 115.0, r = 5,  120.0
   2: x = 126.0, r = 6.0,  132.0
   3: x = 139.3333333333324, r = 7.333333333333333,  146.66666666666669
   4: x = 155.833333333334, r = 9.166666666666664,  164.99999999999997
   5: x = 176.78571428571388, r = 11.785714285714283,  188.57142857142853
   6: x = 204.2857142857146, r = 15.714285714285708,  219.99999999999994
   7: x = 242.0, r = 21.99999999999999,  263.99999999999994
   8: x = 297.0, r = 32.999999999999986,  329.99999999999994
   9: x = 385.0, r = 54.99999999999998,  439.99999999999994
   10: x = 550.0, r = 109.99999999999996,  659.9999999999999
   11: x = 989.9999999999995, r = 329.99999999999983,  1319.9999999999995
   3.0

draw(8,9)

   r = 4896.0
   1: x = 280.0, r = 8,  288.0
   2: x = 297.0, r = 9.0,  306.0
   3: x = 316.19999999999624, r = 10.2,  326.4
   4: x = 338.0571428571484, r = 11.657142857142855,  349.71428571428567
   5: x = 363.1648351648321, r = 13.45054945054945,  376.6153846153846
   6: x = 392.3076923076906, r = 15.692307692307693,  408.0
   7: x = 426.545454545461, r = 18.545454545454547,  445.0909090909091
   8: x = 467.3454545454534, r = 22.254545454545465,  489.6000000000001
   9: x = 516.7999999999984, r = 27.200000000000006,  544.0000000000001
   10: x = 578.0, r = 34.00000000000001,  612.0
   11: x = 655.7142857142836, r = 43.71428571428572,  699.4285714285716
   12: x = 757.7142857142878, r = 58.28571428571428,  816.0
   13: x = 897.600000000003, r = 81.6,  979.2
   14: x = 1101.5999999999976, r = 122.4,  1224.0000000000002
   15: x = 1428.0, r = 204.0,  1632.0
   16: x = 2040.0, r = 408.0,  2448.0
   17: x = 3672.0, r = 1224.0,  4896.0
   3.0

draw(99,100)

   r = 7.8804e6
   1: x = 39501.0, r = 99,  39600.0
   2: x = 39700.0, r = 100.0,  39800.0
   3: x = 39901.01522841007, r = 101.01522842639594,  40002.03045685279
   4: x = 40104.07645290719, r = 102.04599606339997,  40206.12244897959
   5: x = 40309.21507052156, r = 103.09262166405024,  40412.307692307695
   6: x = 40516.463124478025, r = 104.1554321966693,  40620.618556701025
   7: x = 40725.853319693466, r = 105.2347631002617,  40831.08808290155
   8: x = 40937.41904142758, r = 106.33095854922276,  41043.74999999999
   9: x = 41151.194371621066, r = 107.44437172774865,  41258.638743455485
        中略

   198: x = 3.283499999999912e6, r = 656699.9999999664,  3.940199999999879e6
   199: x = 5.910299999999696e6, r = 1.9700999999998182e6,  7.880399999999516e6
   3.000000000000123

 

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

新 macOS

2022年10月27日 | ブログラミング

macOS Ventura バージョン 13.0 (22A380)

になったよ!!!(10月25日)

  • iPhoneをWebカメラ代わりに使える「連係カメラ」
  • 複数のアプリやウィンドウをまとめてグループ化する「ステージマネージャ」
  • メールアプリでは、一度送信操作を行なった直後の取り消しや送信予約
  • 「FaceTime」がHandoff機能に対応し、MacからiPhoneやiPadへシームレスに通話を引き継げるようになった
  • 「Safari」に共有タブグループ機能を追加。ほかのユーザーと閲覧中のタブを共有できる
  • WebサイトへのログインにFace IDやTouch IDが利用できる「パスキー」機能を追加(Webサイト側の対応が必要)
  • 「メッセージ」アプリでSharePlay連携が可能になったほか、メッセージの編集や送信取り消し、削除したメッセージの復元、未読状態への復元機能などを追加 ]
  • 「iCloud」に共有写真ライブラリ機能を追加。5人まで招待でき、個々のライブラリを統合できる
  • 「Spotlight」がクイックルックに対応。検索結果の上でスペースキーを押すことでファイルをプレビューできる様になった。また画像検索がWebとローカル、メッセージ、メモ、Finderを横断するようになった
  • 一時停止した動画の画面内にあるテキストを認識する機能が日本語と韓国語に対応
  • 画像認識が人間に加え新たに動物、鳥、昆虫、彫像、ランドマークを認識するようになった ・ライブキャプションなどアクセシビリティ関連ツールを強化
  • iOSに搭載している「天気」「時計」アプリがMacにも追加
  • 標的型攻撃を受けた際にシステムをロックダウンする「ロックダウンモード」を追加

 

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

Python 3.11.0 が出たよ!

2022年10月27日 | ブログラミング

Python 3.11.0 がダウンロード可能になった

Python.org からダウンロードしよう

> Python を使って開発や実験を行うときは、用途に応じて専用の実行環境を作成し、切り替えて使用するのが一般的です。

などというフェークニュースには惑わされないで...

まあ,一般ユーザが複数の実行環境なんで必要ないですわ。

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

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

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