গণনাপদ্ধতি · গ্রহগণিত ও সংস্কার · প্রবন্ধ ৩৯
মধ্যগ্রহ, স্পষ্টগ্রহ ও বীজসংস্কার: Mean ও True Position-এর পার্থক্য কী?
সিদ্ধান্তীয় গ্রহগণনা সরাসরি “আজ গ্রহ কোথায়” দিয়ে শুরু হয় না। প্রথমে uniform mean motion থেকে মধ্যস্থান, তারপর manda ও śīghra equation-এর মাধ্যমে স্পষ্টস্থান নির্ণীত হয়। এরও আগে বা পাশাপাশি mean-motion parameter-এ bīja correction থাকতে পারে। এই আলাদা স্তরগুলো মিশিয়ে ফেললে Saṅkrānti, তিথি ও গ্রহস্ফুট—সবখানে অনিচ্ছাকৃত পরিবর্তন ছড়িয়ে পড়ে।
এক বাক্যে মূলনীতি: Bīja mean-motion/epoch parameter সংশোধন করে; manda–śīghra equation mean longitude-কে true longitude-এ রূপান্তর করে; project-এর Modern Sankranti Star Fit কেবল solar boundary ও Bengali date-এ সীমাবদ্ধ।
একটি ফলের পেছনে তিনটি আলাদা layer
| Layer | কাজ | Output |
|---|---|---|
| Mean motion | Epoch থেকে uniform angular accumulation | মধ্য longitude |
| Orbital equations | Manda ও śīghra non-uniformity model | স্পষ্ট/true longitude |
| Calendar policy | Saṅkrānti instant থেকে Bengali month/day rule | পঞ্জিকার তারিখ |
এক layer-এর tuning অন্য layer-এ নিজে থেকে প্রযোজ্য নয়। Printed Bengali Panjika-র Saṅkrānti time মিলাতে solar mean parameter-এর একটি isolated fit ব্যবহার করা যেতে পারে; কিন্তু সেই fit Moon, tithi, nakshatra, yoga, karana বা displayed planet longitude-এ ছড়ানো উচিত নয়—যতক্ষণ না আলাদা গবেষণা তা সমর্থন করে।
মধ্যগ্রহ বা mean longitude
Mean বা madhyama model ধরে নেয় যে একটি celestial parameter uniform circular rate-এ চলে। একটি generic modern notation:
λ̄(t) = normalize(λ̄epoch + A · n + B)
A = epoch থেকে elapsed days বা ahargaṇa
n = mean daily motion
B = প্রযোজ্য mean-motion/epoch correction
সূর্যসিদ্ধান্তীয় implementation-এ rate সাধারণত বৃহৎ cycle-এর integer revolutions ও total days থেকে আসে। তাই production engine-এ যতদিন সম্ভব integer/rational arithmetic রাখা ভালো; আগেভাগে decimal degree round করলে শতাব্দীব্যাপী drift তৈরি হতে পারে।
Ahargaṇa, Dinabrinda ও Abda-pinda
- Ahargaṇa/Dinabrinda: নির্ধারিত epoch থেকে elapsed day count বা তার algorithm-specific reduced form;
- Abda-pinda: accumulated/reduced year quantity, যা year-to-day বা epoch reduction-এ ব্যবহৃত হয়;
- Mean revolution: ঐ elapsed interval-এ uniform angular cycles;
- Dhruva/Kṣepaka: epoch offset বা additive constant—school ও handbook অনুযায়ী terminology বদলাতে পারে।
আপনার yearly report-এ engine যে raw intermediate ব্যবহার করে সেটিই print করুন। ঐতিহাসিক শব্দের একটি generic formula report-এ বসিয়ে actual code-এর অন্য মানকে একই label দেওয়া উচিত নয়।
Manda correction: mean থেকে first equation
Mean longitude uniform motion দেখায়, কিন্তু apparent/true motion কখনও ধীর, কখনও দ্রুত। Manda বা “slow” correction mean planet এবং manda-ucca/apogee-এর angular relation থেকে equation নির্ণয় করে।
Manda-kendra = normalize(mean longitude − manda-ucca)
Manda-corrected longitude = mean longitude ± manda-phala
Sign যোগ না বিয়োগ হবে তা anomaly-এর quadrant ও engine rule নির্ধারণ করে। Manda-phala একটি fixed modern Kepler equation নয়; traditional epicycle circumference, sine table এবং prescribed iteration অনুসারে নির্ণীত হয়।
Śīghra correction: Sun-এর সঙ্গে সম্পর্ক
পাঁচ গ্রহের apparent motion ব্যাখ্যায় দ্বিতীয় “fast” বা śīghra construction ব্যবহৃত হয়। Superior ও inferior planet-এর parameter interpretation এক নয়; Mercury ও Venus-এর mean-motion setup-এ śīghrocca গুরুত্বপূর্ণ ভূমিকা রাখে।
সূর্যসিদ্ধান্তের true-place procedure-এ Mars প্রভৃতি গ্রহের জন্য correction একবারে শেষ হয় না। সংক্ষেপে:
- প্রথম śīghra equation-এর অর্ধেক mean place-এ প্রয়োগ;
- তার ওপর প্রথম manda equation-এর অর্ধেক প্রয়োগ;
- Recomputed পূর্ণ manda equation প্রয়োগ;
- Rectified অবস্থান থেকে recomputed পূর্ণ śīghra equation প্রয়োগ।
Sun ও Moon-এর ক্ষেত্রে মূল text একটি manda operation দিয়ে true place নির্ণয়ের কথা বলে; planets-এর ক্ষেত্রে multi-stage correction দেয়।
স্পষ্টগ্রহ বা true position
সব prescribed correction-এর পরে প্রাপ্ত longitude হলো spaṣṭa বা true place। এখানে “true” মানে ঐ traditional model-এর corrected result—Swiss Ephemeris/JPL-এর modern physical ephemeris-এর সঙ্গে গাণিতিকভাবে identical হওয়া নয়।
| Output | ব্যবহার | কী লেখা উচিত |
|---|---|---|
| Mean longitude | Research trace, yearly mean report | “মধ্যগ্রহ” |
| Manda-corrected | Intermediate audit | “মন্দস্পষ্ট” বা explicit intermediate |
| Final traditional true | Classical গ্রহস্ফুট ও pañcāṅga | “সূর্যসিদ্ধান্ত স্পষ্টগ্রহ” |
| Swiss modern longitude | Drik comparison, eclipse, rise/set | “Swiss Ephemeris, Lahiri” |
Comparison rule: একই instant, calendar, time scale, geocentric/topocentric setting, ayanāṃśa ও coordinate type না মিলিয়ে দুই longitude-এর difference প্রকাশ করবেন না।
Bīja-saṃskāra কী?
Bīja বা “seed correction” mean-motion computation-এর parameter/epoch value-তে ছোট পরিবর্তন আনে। ঐতিহাসিক ব্যবহারে এটি দীর্ঘ সময়ে accumulated secular mismatch কমাতে অথবা এক astronomical school/pakṣa-এর result-কে অন্য parameter set-এর সঙ্গে রূপান্তর করতে ব্যবহৃত হয়েছে।
অতএব bīja:
- Manda-phala নয়;
- Śīghra-phala নয়;
- Final longitude-এ ইচ্ছামতো degree যোগ নয়;
- একটি documented mean-motion/epoch correction profile;
- কোন body/parameter-এ কত unit প্রয়োগ হয়েছে তা প্রকাশযোগ্য হওয়া উচিত।
Kyoto pancanga3.14-এর add_bija() port করলে exact body keys, sign ও integer units অপরিবর্তিত রাখুন। C# dictionary-তে value-এর unit comment/XML metadata-তে লিখুন; শুধু “+31” দেখালে সেটি degree, arcminute, revolution count না internal unit—বোঝা যায় না।
এই project-এ তিনটি correction profile
| Profile | Scope | প্রয়োগ |
|---|---|---|
| Classical Base | মূল Surya Siddhanta constants | Historical ও reproducible baseline |
| Classical Bīja | pancanga3.14 add_bija()-এর documented adjustments | Traditional engine-এর নির্ধারিত সব সংশ্লিষ্ট calculations |
| Modern Sankranti Star Fit | ১৯৪৭+ Saṅkrānti ও Bengali month/date only | Printed modern Panjika alignment |
তৃতীয় profile-কে “classical bīja” বলা উচিত নয়। এটি আপনার empirical month-specific modern fit; নাম, cutoff, table version এবং evidence আলাদাভাবে report করতে হবে।
Modern Sankranti Star Correction table
| Solar month | বাংলা মাস | yr["star"] delta |
|---|---|---|
| Meṣa | বৈশাখ | +31 |
| Vṛṣabha | জ্যৈষ্ঠ | +20 |
| Mithuna | আষাঢ় | +23 |
| Karkaṭa | শ্রাবণ | +48 |
| Siṃha | ভাদ্র | +51 |
| Kanyā | আশ্বিন | +39 |
| Tulā | কার্তিক | +33 |
| Vṛścika | অগ্রহায়ণ | +39 |
| Dhanu | পৌষ | +43 |
| Makara | মাঘ | +32 |
| Kumbha | ফাল্গুন | +30 |
| Mīna | চৈত্র | +34 |
Selected cutoff: Gregorian year 1947। ১৯৪৭-এর আগে base/classical profile; ১৯৪৭ ও পরে month-specific fit। Boundary year, table version এবং fit source output metadata-তে লিখুন।
Scope lock: এই table কেবল Saṅkrānti instant ও সেই instant-নির্ভর Bengali date/month boundary-তে। Tithi, yoga, karana, nakshatra, Moon, অন্যান্য planet position, eclipse বা historical data-তে নয়।
C# isolation architecture
১. Solar month এবং immutable table
public enum SolarMonth
{
Mesha = 0, Vrishabha = 1, Mithuna = 2, Karkata = 3,
Simha = 4, Kanya = 5, Tula = 6, Vrischika = 7,
Dhanu = 8, Makara = 9, Kumbha = 10, Mina = 11
}
public static class ModernSankrantiStarFit
{
public const int CutoffGregorianYear = 1947;
public const string Version = "modern-star-fit-1947-v1";
static readonly int[] DeltaBySolarMonth = {
31, 20, 23, 48, 51, 39, 33, 39, 43, 32, 30, 34
};
public static bool Applies(int gregorianYear)
{
return gregorianYear >= CutoffGregorianYear;
}
public static int Delta(SolarMonth month)
{
return DeltaBySolarMonth[(int)month];
}
}
২. Shared dictionary কখনও mutate করবেন না
static IDictionary<string, double> CloneConstants(
IDictionary<string, double> source)
{
return new Dictionary<string, double>(
source, StringComparer.OrdinalIgnoreCase);
}
static IDictionary<string, double> ConstantsForSankranti(
IDictionary<string, double> baseConstants,
int gregorianYear,
SolarMonth month)
{
IDictionary<string, double> copy =
CloneConstants(baseConstants);
if (ModernSankrantiStarFit.Applies(gregorianYear))
copy["star"] = copy["star"] +
ModernSankrantiStarFit.Delta(month);
return copy;
}
Global yr dictionary-তে delta যোগ করে পরে বাদ দেওয়া thread-safe নয়। Exception ঘটলে value restore নাও হতে পারে। Clone-per-calculation সবচেয়ে পরিষ্কার; performance দরকার হলে immutable prebuilt ১২-profile cache ব্যবহার করুন।
৩. Scope-specific service boundary
public SankrantiResult FindSankranti(
int gregorianYear,
SolarMonth month,
PanchangaRequest request)
{
IDictionary<string, double> constants =
ConstantsForSankranti(
_baseYearConstants, gregorianYear, month);
return _solarBoundaryEngine.Find(
gregorianYear, month, request, constants);
}
public ClassicalResult CalculatePanchanga(
PanchangaRequest request)
{
// No Modern Sankranti Star Fit here.
return _classicalEngine.Calculate(
request, _baseYearConstants);
}
Bengali date service মাসের start boundary পাবে FindSankranti() থেকে। কিন্তু sunrise tithi/nakshatra engine সরাসরি unmodified classical constants ব্যবহার করবে।
৪. Trace metadata
public sealed class SankrantiCorrectionTrace
{
public string Profile { get; set; }
public string Version { get; set; }
public int CutoffYear { get; set; }
public int GregorianYear { get; set; }
public SolarMonth SolarMonth { get; set; }
public int StarDelta { get; set; }
public bool Applied { get; set; }
}
Daily Details ও “ঐতিহাসিক সংক্রান্তি যাচাই” page-এ trace দেখান। Historical year-এ Applied=false, delta display ০; modern year-এ month-specific value।
৫. Base বনাম fit comparison
public sealed class SankrantiComparison
{
public SankrantiResult Classical { get; set; }
public SankrantiResult ModernFit { get; set; }
public TimeSpan Difference { get; set; }
}
public SankrantiComparison Compare(
int year, SolarMonth month, PanchangaRequest request)
{
SankrantiResult classical = _solarBoundaryEngine.Find(
year, month, request, _baseYearConstants);
SankrantiResult fitted = FindSankranti(year, month, request);
return new SankrantiComparison {
Classical = classical,
ModernFit = fitted,
Difference = fitted.InstantUtc - classical.InstantUtc
};
}
Bengali year শুরুর Mean Planet report
Report instant হবে ঐ Bengali year-এর Meṣa Saṅkrānti। Modern production year হলে fitted Meṣa instant report anchor হতে পারে; কিন্তু ঐ instant-এ mean ও true planets গণনা করতে unmodified classical planetary constants ব্যবহার করুন। এতে time selection ও planetary model আলাদা থাকে।
প্রস্তাবিত sections
- Bengali year ও dual Julian/Gregorian date;
- Meṣa Saṅkrānti local time, UTC ও Julian Day;
- Saṅkrānti profile: classical না modern fit;
- Modern star delta ও version;
- Abda-pinda;
- Dinabrinda/Ahargaṇa;
- Deshāntara correction;
- Classical bīja table/flags;
- Mean Sun, Moon, Mars, Mercury, Jupiter, Venus, Saturn;
- Mean apogee/node/śīghrocca parameters;
- Manda ও śīghra correction trace;
- Final traditional true longitudes.
public YearlyMeanPlanetReport BuildYearReport(
int bengaliYear,
DesktopLocation location)
{
int approximateGregorianYear = bengaliYear + 593;
SankrantiResult mesha = FindSankranti(
approximateGregorianYear,
SolarMonth.Mesha,
RequestTemplate(location));
// Planetary calculation remains classical/unmodified.
ClassicalTrace trace = _classicalEngine.CalculateTraceAt(
mesha.InstantUtc,
location,
_baseYearConstants);
return YearlyMeanPlanetReport.From(
bengaliYear,
mesha,
trace,
BuildCorrectionTrace(
approximateGregorianYear, SolarMonth.Mesha));
}
bengaliYear + 593 শুধু search seed। Exact year mapping ও historical calendar label আপনার existing BengaliCalendarGridService/Mesha finder থেকে resolve করুন; final date কখনও এই arithmetic alone দিয়ে স্থির করবেন না।
Deshāntara কোথায়?
Deshāntara reference meridian ও local longitude-এর time correction। এটি planet-এর revolution number বা bīja নয়। Report-এ আলাদা line দিন:
Deshāntara time ≈ longitude difference × ৪ minutes per degree
Traditional reference, east/west sign ও unit engine অনুযায়ী লিখুন। Modern time-zone offset-কে deshāntara নামে দেখাবেন না।
Swiss Ephemeris-এর সঙ্গে comparison
Swiss result comparison table useful, কিন্তু model replacement নয়। প্রতি body-র জন্য রাখুন:
- Traditional mean longitude;
- Traditional true longitude;
- Swiss tropical longitude;
- Swiss Lahiri nirayana longitude;
- Traditional true − Swiss Lahiri signed difference;
- Same JD UT/TT, geocentric/topocentric এবং flags.
Mean traditional longitude-কে Swiss true longitude-এর সঙ্গে directly “error” বলা বৈজ্ঞানিকভাবে ঠিক নয়; তারা আলাদা model stage। Compare true-to-true অথবা mean-to-corresponding mean model।
API/XML profile
{
"calculation_profile": {
"classical_constants": "surya-siddhanta-pancanga-3.14",
"classical_bija": true,
"sankranti_fit": "modern-star-fit-1947-v1",
"sankranti_fit_applied": true,
"sankranti_star_delta": 31,
"planetary_fit_applied": false
},
"epoch_trace": {
"julian_day_ut": "...",
"abda_pinda": "...",
"dinabrinda": "...",
"ahargana": "...",
"deshantara": "..."
},
"planets": [
{
"key": "sun",
"mean_longitude": "...",
"manda_correction": "...",
"sighra_correction": null,
"true_longitude": "..."
}
]
}
String ellipsis schema illustration; output নয়। Numerical values raw decimal/rational form এবং formatted degree—দুটিতে রাখা ভালো।
Validation checklist
- Base constants immutable;
- Classical bīja profile named;
- Modern fit profile named separately;
- Modern cutoff exactly 1947;
- 1946 fit not applied;
- 1947 fit applied;
- Meṣa delta +31;
- Vṛṣabha delta +20;
- Mithuna delta +23;
- Karkaṭa delta +48;
- Siṃha delta +51;
- Kanyā delta +39;
- Tulā delta +33;
- Vṛścika delta +39;
- Dhanu delta +43;
- Makara delta +32;
- Kumbha delta +30;
- Mīna delta +34;
- Table length exactly ১২;
- Base dictionary unchanged after fitted call;
- Exception leaves base unchanged;
- Parallel calls do not leak month delta;
- Tithi unchanged by modern fit;
- Nakshatra unchanged;
- Yoga unchanged;
- Karana unchanged;
- Moon longitude unchanged;
- Other planet longitudes unchanged;
- Eclipse calculation unchanged;
- Historical Saṅkrānti uses base;
- Modern Saṅkrānti uses selected delta;
- Bengali month start uses same Saṅkrānti;
- Daily page and test page agree;
- Mean longitude normalized;
- Manda anomaly normalized;
- Manda sign rule tested by quadrant;
- Śīghra sequence preserved;
- Sun/Moon single-manda path;
- Planet multi-stage path;
- No intermediate rounding;
- Ahargaṇa raw value reported;
- Abda-pinda raw value reported;
- Dinabrinda raw value reported;
- Deshāntara sign documented;
- Mesha report instant traceable;
- Planet constants unmodified at report instant;
- Swiss comparison same JD;
- Swiss comparison same ayanāṃśa;
- API/XML profile complete;
- Table version in cache key;
- Regression snapshots retained.
সাধারণ ভুল
| ভুল | ফল | সমাধান |
|---|---|---|
| Mean-কে true label | ভুল scientific meaning | Stage-specific labels |
| Bīja-কে final degree offset | Algorithm ভেঙে যায় | Documented parameter layer |
Global yr["star"] mutate | Thread ও scope leakage | Clone/immutable profile |
| Modern fit সব calculation-এ | Tithi ও planets অনিচ্ছায় বদলে যায় | Sankranti-only service |
| Historical year-এ 1947 fit | Research baseline নষ্ট | Explicit cutoff |
| Correction unit না লেখা | Table পুনরুৎপাদন অসম্ভব | Internal-unit metadata |
| Mean vs Swiss true “error” | অসম stage comparison | True-to-true compare |
উপসংহার
মধ্যগ্রহ uniform mean-motion model-এর অবস্থান; স্পষ্টগ্রহ manda ও śīghra equations-এর পরে traditional corrected অবস্থান। Bīja-saṃskāra mean-motion বা epoch parameter সংশোধনের ঐতিহাসিক উপায়—এটি orbital equation বা arbitrary final offset নয়।
আপনার Modern Sankranti Star Correction একটি আলাদা empirical publication profile: ১৯৪৭ ও পরের বছরে মাসভিত্তিক yr["star"] delta, কেবল Saṅkrānti ও Bengali date-এর জন্য। Base constants clone করে এই service-এ fit প্রয়োগ করলে Tithi, Nakshatra, Yoga, Karana, Moon, planets ও historical research অক্ষত থাকে।
Yearly Mean Planet report-এ fitted Meṣa Saṅkrānti-কে time anchor হিসেবে নেওয়া যেতে পারে; কিন্তু ঐ instant-এর mean/true planets unmodified classical planetary model দিয়ে গণনা করুন। Profile, version, delta ও every intermediate trace প্রকাশ করলেই result যাচাইযোগ্য থাকবে।
তথ্যসূত্র ও আরও পাঠ
- Sūrya-Siddhānta English translation; mean এবং true places, manda ও śīghra procedures.
- Ebenezer Burgess—Translation of the Sūrya-Siddhānta; complete public-domain edition.
- Kyoto Sangyo University Pancanga 3.14; Surya Siddhanta ও Pañcasiddhāntikā selectable calculation implementation.
- Cidambi, Montelle & Plofker—Astronomical handbooks in 16th-century South Asia; mean motion ও bīja-correction analysis.
- Positional Astronomy Centre—Bīja Corrections; mean Sūrya-Siddhānta longitude ও modern correction comparison.
- সূর্য সিদ্ধান্ত পঞ্জিকা project specification; ১৯৪৭ cutoff, ১২-month Modern Sankranti Star Fit এবং scope-isolation policy.
মন্তব্য, আলোচনা ও প্রশ্ন