সোনার সর্পিল পদ্ধতি
আপনি বলেছিলেন যে আপনি সোনার সর্পিল পদ্ধতিটি কাজ করতে পারবেন না এবং এটি লজ্জাজনক কারণ এটি সত্যই, সত্যিই ভাল। আমি আপনাকে এটি সম্পর্কে একটি সম্পূর্ণ ধারণা দিতে চাই যাতে সম্ভবত আপনি কীভাবে এটিকে "গুছিয়ে রাখা" থেকে দূরে রাখতে পারবেন তা বুঝতে পারেন।
সুতরাং প্রায় একটি সঠিক জালিয়াতি তৈরির জন্য একটি দ্রুত, অ-এলোমেলো উপায় এখানে; উপরে আলোচিত হিসাবে, কোনও জালিস নিখুঁত হবে না, তবে এটি যথেষ্ট ভাল হতে পারে। এটি অন্যান্য পদ্ধতির সাথে তুলনা করা হয় যেমন বেন্ডউইউইওআর.অর্গ এ তবে এটিতে একটি সুন্দর এবং চমত্কার চেহারা পাশাপাশি সীমাতে এমনকি ব্যবধান সম্পর্কে গ্যারান্টি রয়েছে।
প্রাইমার: ইউনিট ডিস্কে সূর্যমুখী সর্পিল
এই অ্যালগরিদমটি বোঝার জন্য, আমি আপনাকে প্রথমে 2 ডি সূর্যমুখী সর্পিল অ্যালগরিদমটি দেখার জন্য আমন্ত্রণ জানাচ্ছি। এটি এই সত্যের উপর ভিত্তি করে তৈরি হয় যে সর্বাধিক অযৌক্তিক সংখ্যাটি হ'ল সোনার অনুপাত (1 + sqrt(5))/2
এবং "যদি কেউ" কেন্দ্রে দাঁড়ান, পুরো বাঁকগুলির একটি সুবর্ণ অনুপাত ঘুরিয়ে দেন, তবে সেই দিকটিতে অন্য একটি বিন্দু নির্গত হন, "একটি স্বাভাবিকভাবেই একটি গঠন করে সর্পিল যা আপনি উচ্চ ও উচ্চতর সংখ্যক পয়েন্টগুলিতে পৌঁছালেও তবুও পয়েন্টগুলি লাইন রাখার মতো 'বার' ভালভাবে সংজ্ঞায়িত করতে অস্বীকার করে। (নোট 1.)
একটি ডিস্কে এমনকি ব্যবধানের জন্য অ্যালগরিদম হ'ল
from numpy import pi, cos, sin, sqrt, arange
import matplotlib.pyplot as pp
num_pts = 100
indices = arange(0, num_pts, dtype=float) + 0.5
r = sqrt(indices/num_pts)
theta = pi * (1 + 5**0.5) * indices
pp.scatter(r*cos(theta), r*sin(theta))
pp.show()
এবং এটি (n = 100 এবং n = 1000) এর মতো দেখতে ফলাফল তৈরি করে:
পয়েন্টগুলি রেডিয়ালি ফাঁক করে দেওয়া
মূল আজব জিনিসটি সূত্র r = sqrt(indices / num_pts)
; আমি কীভাবে তার কাছে এসেছি? (দ্রষ্টব্য ২)
ঠিক আছে, আমি এখানে স্কোয়ার রুটটি ব্যবহার করছি কারণ আমি এগুলি ডিস্কের চারপাশে সম-অঞ্চল ফাঁকা রাখতে চাই। এটি একই বলে যে বৃহত এন এর সীমাতে আমি তার অঞ্চলটির সাথে আনুপাতিক সংখ্যক পয়েন্ট ধারণ করতে একটি ছোট অঞ্চল R ∈ ( r , r + d r ), Θ ∈ ( θ , θ + d θ ) চাই, যা r d r d θ । এখন যদি আমরা ভান করি যে আমরা এখানে একটি এলোমেলো পরিবর্তনশীল সম্পর্কে কথা বলছি, তবে এটির সরল ব্যাখ্যা আছে যে ( আর , Θ ) এর জন্য যৌথ সম্ভাবনার ঘনত্বটি কেবল সিআরকিছু ধ্রুবক জন্য গ । ইউনিট ডিস্কে সাধারণকরণ এরপরে c = 1 / force জোর করে π
এখন আমাকে একটি কৌশল চালু করা যাক। এটি সম্ভাব্যতা তত্ত্ব থেকে আসে যেখানে এটি বিপরীত সিডিএফের নমুনা হিসাবে পরিচিত : মনে করুন আপনি একটি সম্ভাব্য ঘনত্ব এফ ( জেড ) দিয়ে একটি এলোমেলো পরিবর্তনশীল তৈরি করতে চেয়েছিলেন এবং আপনার একটি র্যান্ডম ভেরিয়েবল ইউ -ইউনিফর্ম (0, 1) রয়েছে ঠিক তেমনই বেশিরভাগ প্রোগ্রামিং ভাষায়। তুমি এটা কিভাবে করো?random()
- প্রথমে আপনার ঘনত্বকে একটি ক্রম বিতরণ ফাংশন বা সিডিএফে পরিণত করুন, যা আমরা এফ ( জেড ) বলব । একটি সিডিএফ, মনে রাখবেন, ডেরিভেটিভ এফ ( জেড ) এর সাথে 0 থেকে 1 এ একতরফাভাবে বৃদ্ধি পায় ।
- তারপরে সিডিএফের বিপরীতমুখী ফাংশন এফ -1 ( জেড ) গণনা করুন ।
- আপনি দেখতে পাবেন যে জেড = এফ -1 ( ইউ ) লক্ষ্য ঘনত্ব অনুযায়ী বিতরণ করা হয়েছে। (নোট 3).
এখন সোনালি-অনুপাতের সর্পিল ট্রিকটি পয়েন্টগুলি একটি সুন্দর এমনকি প্যাটার্নে ফাঁকা করে θ সুতরাং আসুন এটি একীভূত করা যাক; ইউনিট ডিস্কের জন্য আমরা এফ ( আর ) = আর 2 দিয়ে রেখেছি । সুতরাং বিপরীত ফাংশনটি হ'ল F -1 ( u ) = u 1/2 , এবং সেইজন্য আমরা ডিস্কের সাথে মেরু স্থানাঙ্কে এলোমেলো পয়েন্ট উত্পন্ন করব r = sqrt(random()); theta = 2 * pi * random()
।
এখন এলোমেলোভাবে এই বিপরীত ফাংশনটি নমুনা দেওয়ার পরিবর্তে আমরা এটি অভিন্নভাবে নমুনা দিচ্ছি , এবং ইউনিফর্ম নমুনা সম্পর্কে চমৎকার বিষয়টি হল যে বড় এন এর সীমাতে পয়েন্টগুলি কীভাবে ছড়িয়ে পড়েছে সে সম্পর্কে আমাদের ফলাফলগুলি আচরণ করবে যেন আমরা এলোমেলোভাবে নমুনা রেখেছি। এই সংমিশ্রণটি কৌশলটি। পরিবর্তে random()
আমরা ব্যবহার করুন (arange(0, num_pts, dtype=float) + 0.5)/num_pts
, যাতে, বলুন, যদি আমরা 10 পয়েন্ট সেগুলি নমুনা করতে চাই r = 0.05, 0.15, 0.25, ... 0.95
। আমরা অবিশেষে নমুনা দ সমান-অঞ্চল ব্যবধান পেতে, এবং আমরা সূর্যমুখী বৃদ্ধি ব্যবহার ভয়াবহ আউটপুটে পয়েন্ট "বার" এড়ানো।
এখন একটি গোলকের উপর সূর্যমুখী করছেন
পয়েন্টগুলি সহ গোলকের বিন্দুতে আমাদের যে পরিবর্তনগুলি করা দরকার তা হ'ল গোলাকার স্থানাঙ্কগুলির জন্য মেরু স্থানাঙ্কগুলি সরিয়ে নেওয়া জড়িত। অবশ্যই রেডিয়াল সমন্বয় এটিতে প্রবেশ করে না কারণ আমরা একটি ইউনিট গোলকের মধ্যে আছি। জিনিসগুলিকে এখানে কিছুটা সামঞ্জস্যপূর্ণ রাখতে, যদিও আমি একজন পদার্থবিদ হিসাবে প্রশিক্ষণ পেয়েছি আমি গণিতবিদদের স্থানাঙ্ক ব্যবহার করব যেখানে 0 ≤ φ ≤ lat মেরু থেকে অক্ষাংশ নিচে নেমে আসছে এবং 0 ≤ θ ≤ 2π দ্রাঘিমাংশ হয়। উপরে থেকে পার্থক্য সুতরাং যে আমরা মূলত পরিবর্তনশীল প্রতিস্থাপন করা হয় দ সঙ্গে φ ।
আমাদের এলাকায় উপাদান, যা ছিল দ ঘ দ ঘ θ , এখন না অনেক-আরো-জটিল পাপ (হয়ে φ ) ঘ φ ঘ θ । সুতরাং অভিন্ন ব্যবধানের জন্য আমাদের যৌথ ঘনত্ব হ'ল পাপ ( φ ) / 4π π Θ সংহত করে , আমরা f ( φ ) = sin ( φ ) / 2 খুঁজে পাই , এইভাবে F ( φ ) = (1 - কোস ( φ )) / 2। এটি উল্টিয়ে আমরা দেখতে পাচ্ছি যে অভিন্ন র্যান্ডম ভেরিয়েবলটি আকোসের (1 - 2 u ) মত দেখাবে , তবে আমরা এলোমেলো পরিবর্তে অভিন্নরূপে নমুনা করি, তাই আমরা পরিবর্তে φ কে = একোস (1 - 2 ( কে) ব্যবহার করি+ 0.5) / এন )। এবং বাকি অ্যালগরিদম কেবল এক্স, ওয়াই এবং জেড স্থানাঙ্কের মধ্যে এটি প্রজেক্ট করছে:
from numpy import pi, cos, sin, arccos, arange
import mpl_toolkits.mplot3d
import matplotlib.pyplot as pp
num_pts = 1000
indices = arange(0, num_pts, dtype=float) + 0.5
phi = arccos(1 - 2*indices/num_pts)
theta = pi * (1 + 5**0.5) * indices
x, y, z = cos(theta) * sin(phi), sin(theta) * sin(phi), cos(phi);
pp.figure().add_subplot(111, projection='3d').scatter(x, y, z);
pp.show()
আবার এন = 100 এবং এন = 1000 এর জন্য ফলাফলগুলি দেখতে দেখতে:
আরও গবেষণা
আমি মার্টিন রবার্টসের ব্লগে একটি চিৎকার দিতে চেয়েছিলাম। নোট করুন যে উপরে আমি প্রতিটি সূচকে 0.5 যোগ করে আমার সূচকগুলির একটি অফসেট তৈরি করেছি। এটি কেবল আমার কাছে দৃষ্টি আকর্ষণীয় ছিল, তবে এটি প্রমাণিত হয়েছে যে অফসেটের পছন্দটি অনেক বিষয় বিবেচনা করে এবং অন্তরের সাথে ধ্রুবক নয় এবং সঠিকভাবে চয়ন করা হলে প্যাকিংয়ের ক্ষেত্রে 8% এর চেয়ে বেশি যথার্থতা পাওয়ার অর্থ হতে পারে। কোনও গোলকটি cover েকে দেওয়ার জন্য তার আর ২ ক্রম পাওয়ারও একটি উপায় থাকতে হবে এবং এটি আকর্ষণীয়ও হবে যে এটি একটি দুর্দান্ত এমনকি আচ্ছাদনও তৈরি করেছে, সম্ভবত যেমন আছে তবে সম্ভবত প্রয়োজন ছিল, বলার অপেক্ষা রাখে না, কেবল অর্ধেক থেকে নেওয়া ইউনিট বর্গক্ষেত্রটি তির্যকভাবে কাটা বা কাটা এবং একটি বৃত্ত পেতে চারদিকে প্রসারিত।
মন্তব্য
এই "বারগুলি" সংখ্যার সাথে যুক্তিযুক্ত আনুষঙ্গিকতার দ্বারা গঠিত হয়, এবং সংখ্যার সর্বোত্তম যুক্তিসঙ্গত অনুমানগুলি তার অব্যাহত ভগ্নাংশ প্রকাশ থেকে আসে, z + 1/(n_1 + 1/(n_2 + 1/(n_3 + ...)))
যেখানে z
একটি পূর্ণসংখ্যা এবং n_1, n_2, n_3, ...
হয় হয় ইতিবাচক পূর্ণসংখ্যার একটি সীমাবদ্ধ বা অসীম অনুক্রম:
def continued_fraction(r):
while r != 0:
n = floor(r)
yield n
r = 1/(r - n)
যেহেতু ভগ্নাংশের অংশটি 1/(...)
সর্বদা শূন্য এবং একের মধ্যে থাকে, অবিরত ভগ্নাংশের একটি বড় পূর্ণসংখ্যা বিশেষত ভাল যুক্তিযুক্ত আনুমানিকতার জন্য অনুমতি দেয়: "100 এবং 101 এর মধ্যে যে কোনও কিছু দ্বারা বিভক্ত একটি" "1 থেকে 2 এর মধ্যে বিভক্ত একের চেয়ে ভাল" is সর্বাধিক অযৌক্তিক সংখ্যাটি হ'ল এটি একটি 1 + 1/(1 + 1/(1 + ...))
এবং এটিতে বিশেষত ভাল যুক্তিযুক্ত আনুমানিকতা নেই; এক সমাধান করতে পারে φ = 1 + 1 টি / φ দ্বারা মাধ্যমে গুন দ্বারা φ সুবর্ণ অনুপাত জন্য সূত্র জন্য।
যেসব লোক NumPy এর সাথে এতটা পরিচিত নন - তাদের সমস্ত ক্রিয়াকলাপই "ভেক্টরাইজড", যাতে sqrt(array)
অন্য ভাষাগুলি কী লিখতে পারে তার মতোই map(sqrt, array)
। সুতরাং এটি একটি উপাদান-দ্বারা-উপাদান sqrt
অ্যাপ্লিকেশন। এটি একইভাবে একটি স্কেলার দ্বারা বিভাজন বা স্কেলারের সাথে সংযোজনকে ধারণ করে - এগুলি সমান্তরালভাবে সমস্ত উপাদানগুলিতে প্রয়োগ হয়।
প্রমাণটি সহজ আপনি একবার জানেন যে এটি ফলাফল। আপনি জিজ্ঞাসা সম্ভাব্যতা যে z- র < টু Z < z- র + D z- র , এই জিজ্ঞাসা কি সম্ভাব্যতা যে হিসাবে একই z- র < এফ -1 ( ইউ ) < z- র + D z- র আবেদন এফ লক্ষ এটা যে সব তিনটি এক্সপ্রেশন থেকে একঘেয়েমি ক্রমবর্ধমান ফাংশন, তাই এফ ( জেড ) < ইউ < এফ ( জেড + ডি জেড ), এফ ( জেড ) + চ সন্ধানের জন্য ডান হাতটি প্রসারিত করুন( z ) d z , এবং যেহেতু ইউ অভিন্ন তাই এই সম্ভাবনাটি কেবল f ( z ) d z হিসাবে প্রতিশ্রুতিবদ্ধ।