পাঠ ২১ · ৫৭-এর মধ্যে · মডিউল ৫
Home / Courses / Numerical Methods / ফাইনাইট ডিফারেন্স

নিউমেরিক্যাল ডিফারেনশিয়েশন — ফাইনাইট ডিফারেন্স

Numerical differentiation — finite differences
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • কেন নিউমেরিক্যাল ডিফারেনশিয়েশন দরকার হয়, এবং এটি ক্যালকুলাসের এনালিটিক্যাল ডেরিভেটিভের বিকল্প কীভাবে
  • ফরওয়ার্ড, ব্যাকওয়ার্ড ও সেন্ট্রাল ডিফারেন্স ফর্মুলা — এবং টেইলর সিরিজ থেকে এগুলোর এরর অর্ডার কীভাবে আসে
  • একটি সত্যিকারের Python ডেমো — sin(x)-এর ডেরিভেটিভ তিনটি মেথড দিয়ে আনুমানিক করে cos(x)-এর প্রকৃত মানের সাথে তুলনা
  • h ছোট করার সাথে এরর কীভাবে কমে (বা খুব ছোট হলে কেন কমা বন্ধ হয়ে যেতে পারে) তা পর্যবেক্ষণ

১ · কেন নিউমেরিক্যালি ডেরিভেটিভ বের করতে হয়

ডেরিভেটিভএকটি ফাংশনের কোনো বিন্দুতে পরিবর্তনের হার (রেট অফ চেঞ্জ) — গ্রাফের সেই বিন্দুর স্পর্শক রেখার ঢাল। ../math-for-ai/-এ এর গাণিতিক সংজ্ঞা বিস্তারিত আছে। কী তা Math for AI & ML কোর্সে বিস্তারিত পড়ানো হয়েছে — সংক্ষেপে, f'(x) মানে f বিন্দু x-এ কতটা দ্রুত পরিবর্তিত হচ্ছে। স্কুলে আমরা ডেরিভেটিভের সূত্র (পাওয়ার রুল, চেইন রুল ইত্যাদি) দিয়ে এনালিটিক্যালি ডেরিভেটিভ বের করি। কিন্তু বাস্তবে প্রায়ই এটি সম্ভব হয় না:

শুধু ডেটা-পয়েন্ট আছে
একটি সেন্সর থেকে প্রতি সেকেন্ডে তাপমাত্রা রেকর্ড করা হচ্ছে — কোনো সূত্র নেই, শুধু বিচ্ছিন্ন সংখ্যার তালিকা। "তাপমাত্রা কত দ্রুত বাড়ছে" জানতে ফাইনাইট ডিফারেন্স ছাড়া উপায় নেই।
ফাংশন একটি ব্ল্যাক-বক্স
ফাংশনটি হয়তো একটি জটিল সিমুলেশন প্রোগ্রাম বা এক্সটার্নাল সিস্টেম — এর সোর্স সমীকরণ হাতে নেই, শুধু ইনপুট দিলে আউটপুট পাওয়া যায়।
এনালিটিক্যাল ডেরিভেটিভ ব্যবহারিকভাবে অসম্ভব
ফাংশনটি এত জটিল যে হাতে ডেরিভেটিভ বের করা প্র্যাক্টিক্যালি অসম্ভব বা এরর-প্রবণ — অপ্টিমাইজেশন (M9) ও ODE সলভিং (M6-M7)-এ এটি বারবার ঘটে।

২ · তিনটি ফাইনাইট-ডিফারেন্স ফর্মুলা

ডেরিভেটিভের সংজ্ঞা হলো একটি লিমিট: f'(x) = lim(h→0) [f(x+h) - f(x)] / h। ফাইনাইট ডিফারেন্সের মূল ধারণা — h-কে শূন্যের দিকে না নিয়ে একটি ছোট (কিন্তু নন-জিরো) মান রেখে দেওয়া, এবং লিমিটের বদলে সরাসরি এই ভগ্নাংশটুকু হিসাব করা।

ফরওয়ার্ড ডিফারেন্স — সামনের দিকে একধাপ এগিয়ে দেখে:

$$f'(x_0) \approx \frac{f(x_0+h) - f(x_0)}{h}$$

ব্যাকওয়ার্ড ডিফারেন্স — পেছনের দিকে একধাপ দেখে:

$$f'(x_0) \approx \frac{f(x_0) - f(x_0-h)}{h}$$

সেন্ট্রাল ডিফারেন্স — দুই পাশ থেকে সমান দূরত্বে দেখে:

$$f'(x_0) \approx \frac{f(x_0+h) - f(x_0-h)}{2h}$$

টেইলর সিরিজ ব্যবহার করে f(x₀+h)-কে f(x₀)-এর চারপাশে বিস্তৃত করলে দেখা যায় ফরওয়ার্ড ও ব্যাকওয়ার্ড ডিফারেন্সের ট্রাংকেশন এরর O(h) — অর্থাৎ h অর্ধেক করলে এরর মোটামুটি অর্ধেক হয়। কিন্তু সেন্ট্রাল ডিফারেন্সে টেইলর সম্প্রসারণের প্রথম-অর্ডার (h) পদটি ক্যান্সেল হয়ে যায় বিয়োগের সময়, ফলে এরর O(h²) — h অর্ধেক করলে এরর প্রায় এক-চতুর্থাংশ হয়ে যায়। এটাই সেন্ট্রাল ডিফারেন্সের সবচেয়ে বড় সুবিধা, এবং নিচের কোড সেলে আমরা এটি বাস্তবে গণনা করে দেখব।

গুরুত্বপূর্ণ পার্থক্য

সেন্ট্রাল ডিফারেন্স একই সংখ্যক ফাংশন-ইভ্যালুয়েশন (দুটি) ব্যবহার করেই ফরওয়ার্ড/ব্যাকওয়ার্ডের চেয়ে অনেক বেশি নির্ভুল ফলাফল দেয় — এটি "বিনামূল্যে" পাওয়া নির্ভুলতা, কোনো অতিরিক্ত কম্পিউটেশনাল খরচ ছাড়াই। তবে সেন্ট্রাল ডিফারেন্সের জন্য x₀-এর দুই পাশের মান দরকার — একটি ইন্টারভালের একেবারে প্রান্তে (যেমন একটি ডেটাসেটের প্রথম বা শেষ পয়েন্টে) এটি সরাসরি প্রযোজ্য হয় না, সেখানে ফরওয়ার্ড/ব্যাকওয়ার্ড ব্যবহার করতে হয়।

৩ · সত্যিকারের ডেমো — sin(x)-এর ডেরিভেটিভ আনুমানিক করা

f(x) = sin(x)-এর প্রকৃত ডেরিভেটিভ জানা আছে — f'(x) = cos(x)। তাই আমরা x₀ = 0.8 বিন্দুতে তিনটি মেথড দিয়ে ডেরিভেটিভ আনুমানিক করে, প্রকৃত মান cos(0.8)-এর সাথে তুলনা করে সত্যিকারের এরর দেখতে পারি — এবং h ছোট করার সাথে সাথে সেই এরর কীভাবে বদলায় তা পর্যবেক্ষণ করতে পারি।

Python
import math

def f(x):
    return math.sin(x)

def fprime_true(x):
    return math.cos(x)

x0 = 0.8
true_val = fprime_true(x0)
print(f"true f'({x0}) = cos({x0}) = {true_val:.10f}")
print()
print(f"{'h':>10} | {'forward':>12} {'err_f':>12} | {'backward':>12} {'err_b':>12} | {'central':>12} {'err_c':>12}")

hs = [0.1, 0.01, 0.001, 0.0001]
for h in hs:
    fwd = (f(x0+h) - f(x0)) / h
    bwd = (f(x0) - f(x0-h)) / h
    cen = (f(x0+h) - f(x0-h)) / (2*h)
    err_f = abs(fwd - true_val)
    err_b = abs(bwd - true_val)
    err_c = abs(cen - true_val)
    print(f"{h:>10} | {fwd:>12.8f} {err_f:>12.2e} | {bwd:>12.8f} {err_b:>12.2e} | {cen:>12.8f} {err_c:>12.2e}")

    
প্রকৃত মান cos(0.8) = 0.6967067093। h = 0.1-এ ফরওয়ার্ড ডিফারেন্সের এরর ৩.৭০ × ১০⁻² এবং ব্যাকওয়ার্ডের এরর ৩.৪৭ × ১০⁻² — কিন্তু সেন্ট্রাল ডিফারেন্সের এরর মাত্র ১.১৬ × ১০⁻³, প্রায় ৩০ গুণ ছোট, একই h ও একই সংখ্যক ফাংশন-কল দিয়ে! আরও লক্ষ্য করুন — h কে ১০ গুণ ছোট করলে (০.১ → ০.০১) ফরওয়ার্ড/ ব্যাকওয়ার্ডের এরর প্রায় ১০ গুণ কমে (৩.৭০ × ১০⁻² → ৩.৬০ × ১০⁻³, O(h) নিশ্চিত করে), কিন্তু সেন্ট্রাল ডিফারেন্সের এরর কমে ১০০ গুণ (১.১৬ × ১০⁻³ → ১.১৬ × ১০⁻⁵) — ঠিক O(h²) আচরণ, যেমনটা টেইলর সিরিজ বিশ্লেষণ থেকে আশা করা হয়েছিল।

৪ · h কতটা ছোট করা উচিত?

উপরের টেবিলে h = 0.0001-এ সেন্ট্রাল ডিফারেন্সের এরর ১.১৬ × ১০⁻⁹ — এখনও কমছে। কিন্তু এই প্রবণতা অসীম পর্যন্ত চলে না। ফ্লোটিং-পয়েন্ট সংখ্যার সীমিত নির্ভুলতার কারণে (M1/L02-এ বিস্তারিত), যখন h অতিরিক্ত ছোট হয়ে যায়, তখন f(x₀+h) ও f(x₀-h)-এর মধ্যে বিয়োগে ক্যাটাস্ট্রফিক ক্যান্সেলেশন (দুটি প্রায়-সমান সংখ্যার বিয়োগে নির্ভুলতা হারানো) শুরু হয় — ট্রাংকেশন এরর কমতে থাকলেও রাউন্ড-অফ এরর বাড়তে থাকে, এবং একটি নির্দিষ্ট বিন্দুর পর মোট এরর আবার বাড়তে শুরু করে। এটি নিউমেরিক্যাল মেথডের একটি সাধারণ থিম — "যত ছোট তত ভালো" সবসময় সত্যি নয়, বরং একটি সুইট স্পট খুঁজতে হয় (M3/L14-এ কন্ডিশন নাম্বার এই একই ধরনের ট্রেড-অফের আরেকটি রূপ)।

মূল কথা · Key takeaway

ফাইনাইট ডিফারেন্স ডেরিভেটিভের সংজ্ঞাগত লিমিটকে একটি ছোট, নন-জিরো h দিয়ে প্রতিস্থাপন করে। সেন্ট্রাল ডিফারেন্স — দুই পাশ থেকে সমান দূরত্বে দেখে — টেইলর সিরিজে প্রথম-অর্ডার এরর টার্ম ক্যান্সেল করে দেয়, ফলে O(h²) নির্ভুলতা পাওয়া যায় বিনা অতিরিক্ত খরচে। পরের পাঠ (L22) এই একই সেন্ট্রাল-ডিফারেন্স ফলাফলকে আরও নির্ভুল করতে রিচার্ডসন এক্সট্রাপোলেশন ব্যবহার করবে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ সেন্ট্রাল ডিফারেন্স একই সংখ্যক ফাংশন-কল দিয়ে ফরওয়ার্ড/ব্যাকওয়ার্ডের চেয়ে অনেক বেশি নির্ভুল — তাহলে ফরওয়ার্ড/ব্যাকওয়ার্ড ডিফারেন্স আদৌ কেন ব্যবহার করা হয়?

সেন্ট্রাল ডিফারেন্সের জন্য x₀-এর দুই পাশের মান দরকার। যদি x₀ একটি ডোমেইনের প্রান্তে থাকে (যেমন একটি টাইম-সিরিজের প্রথম বা শেষ ডেটা-পয়েন্ট, বা একটি বাউন্ডারি ভ্যালু প্রবলেমের সীমানা — M7-এ প্রাসঙ্গিক), তাহলে একদিকের মান পাওয়া যায় না। সেক্ষেত্রে ফরওয়ার্ড (শুরুতে) বা ব্যাকওয়ার্ড (শেষে) ডিফারেন্স ব্যবহার করতে হয় — কম নির্ভুল হলেও এটিই একমাত্র উপায়।

প্র ০২ h কমানোর সাথে সাথে সেন্ট্রাল ডিফারেন্সের এরর প্রথমে O(h²) হারে কমে, কিন্তু h অতিরিক্ত ছোট হলে আবার বাড়তে শুরু করতে পারে বলা হয়েছে। এর পেছনের কারণ কী?

মোট এরর দুটি উৎস থেকে আসে — টেইলর ট্রাংকেশন এরর (যা h কমলে কমে) এবং ফ্লোটিং-পয়েন্ট রাউন্ড-অফ এরর (যা h কমলে বাড়ে, কারণ f(x₀+h) ও f(x₀-h) প্রায় সমান হয়ে যায় এবং তাদের বিয়োগে সিগনিফিক্যান্ট ডিজিট হারিয়ে যায় — একে ক্যাটাস্ট্রফিক ক্যান্সেলেশন বলা হয়)। এই দুই বিপরীতমুখী প্রবণতার সমষ্টি একটি U-আকৃতির মোট-এরর কার্ভ তৈরি করে, যার একটি সর্বনিম্ন বিন্দু (অপ্টিমাল h) থাকে — M1/L02-L03-এ এই রাউন্ড-অফ বনাম ট্রাংকেশন এররের ট্রেড-অফ বিস্তারিত আলোচিত হয়েছে।

প্র ০৩ যদি আপনার কাছে শুধু একটি ফাংশনের মান একটি নির্দিষ্ট গ্রিডে (সমান-দূরত্বে ব্যবধানে) পাওয়া যায় (যেমন একটি সেন্সরের রিডিং), তাহলে ফরওয়ার্ড, ব্যাকওয়ার্ড ও সেন্ট্রাল — কোনটি কোন পয়েন্টে ব্যবহার করবেন বলে আপনার মনে হয়?

গ্রিডের প্রথম পয়েন্টে শুধু ফরওয়ার্ড সম্ভব (পেছনে কোনো ডেটা নেই), শেষ পয়েন্টে শুধু ব্যাকওয়ার্ড সম্ভব (সামনে কোনো ডেটা নেই), আর মাঝের প্রতিটি পয়েন্টে সেন্ট্রাল ডিফারেন্স ব্যবহার করাই সবচেয়ে নির্ভুল পছন্দ — কারণ দুই পাশের ডেটা পাওয়া যাচ্ছে এবং এটি বিনা অতিরিক্ত খরচে O(h²) নির্ভুলতা দেয়।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে h-কে 0.0001 থেকে 0.00001-এ (আরও ১০ গুণ ছোট) করলে সেন্ট্রাল ডিফারেন্সের এরর মোটামুটি কত গুণ কমবে বলে আপনার ধারণা?

    সেন্ট্রাল ডিফারেন্স O(h²) হারে কনভার্জ করে, তাই h-কে ১০ গুণ ছোট করলে এরর মোটামুটি ১০² = ১০০ গুণ ছোট হওয়ার কথা — যদি না ততক্ষণে রাউন্ড-অফ এরর প্রাধান্য পেতে শুরু করে (উপরের আলোচনা দেখুন)।

  2. পরীক্ষা করুন: উপরের কোড সেলের hs তালিকায় 0.00001 যোগ করে Run চেপে আপনার অনুমান যাচাই করুন — এরর কি ঠিক ১০০ গুণ কমল, নাকি রাউন্ড-অফ এরর ইতিমধ্যে দৃশ্যমান হতে শুরু করেছে?

    x₀ = 0.8-এর মতো একটি সাধারণ বিন্দুতে double-নির্ভুলতার ফ্লোটিং-পয়েন্টে h = 0.00001 এখনও যথেষ্ট বড় যে বিশুদ্ধ O(h²) আচরণ প্রায় বজায় থাকে (এরর প্রায় ১০০ গুণ কমার কাছাকাছি যাওয়ার কথা) — কিন্তু h আরও অনেক ছোট করলে (যেমন ১০⁻১২ বা তার কম) আপনি রাউন্ড-অফ এররের প্রভাব স্পষ্ট দেখতে পাবেন, যেখানে আর নির্ভুলতা বাড়বে না বরং কমতে শুরু করবে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ এরর অ্যানালাইসিস, রুট-ফাইন্ডিং, লিনিয়ার সিস্টেম, ইন্টারপোলেশন, নিউমেরিক্যাল ইন্টিগ্রেশন, ODE সলভিং, আইগেনভ্যালু মেথড, অপ্টিমাইজেশন ও ক্যাপস্টোন — বাকি পাঠগুলো একে একে যুক্ত হচ্ছে।
  • Math for AI & ML কোর্স সহোদর কোর্স ডেরিভেটিভ, ভেক্টর ও লিমিটের মূল সংজ্ঞা ও ক্যালকুলাসের ভিত্তি এই কোর্সে বিস্তারিত পড়ানো হয়েছে।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, Machine Learning, Deep Learning, System Design, Cybersecurity, Cloud Computing & DevOps, এবং আরও অনেক কোর্স — সব এক জায়গায়।
আগের পাঠ
লিস্ট-স্কয়ার্স কার্ভ ফিটিং ও লিনিয়ার রিগ্রেশন