আমি কোনও ফাংশনের ডেরাইভেটিভকে কীভাবে গণনা করব?
y = x 2 +1
ব্যবহার করছেন numpy
?
ধরা যাক, আমি এক্স = 5 তে ডেরিভেটিভের মান চাই ...
আমি কোনও ফাংশনের ডেরাইভেটিভকে কীভাবে গণনা করব?
y = x 2 +1
ব্যবহার করছেন numpy
?
ধরা যাক, আমি এক্স = 5 তে ডেরিভেটিভের মান চাই ...
উত্তর:
আপনার চারটি বিকল্প আছে
সীমাবদ্ধ পার্থক্যগুলির জন্য কোনও বাহ্যিক সরঞ্জামের প্রয়োজন নেই তবে সংখ্যাসূচক ত্রুটির প্রবণতা রয়েছে এবং যদি আপনি একটি বহুবিধ পরিস্থিতিতে থাকেন তবে কিছুক্ষণ সময় নিতে পারে।
আপনার সমস্যাটি যথেষ্ট সহজ হলে প্রতীকী পার্থক্যটি আদর্শ। প্রতীকী পদ্ধতিগুলি আজকাল বেশ শক্তিশালী হচ্ছে। সিমপাই এটির জন্য একটি দুর্দান্ত প্রকল্প যা NumPy এর সাথে ভালভাবে সংহত করে। অটোর্যাপ বা ল্যাম্বডিফাই ফাংশনগুলি দেখুন বা অনুরূপ প্রশ্নের সম্পর্কে জেনসেনের ব্লগপোস্টটি দেখুন ।
স্বয়ংক্রিয় ডেরাইভেটিভগুলি খুব শীতল, সংখ্যাগত ত্রুটির ঝুঁকিতে নেই, তবে কিছু অতিরিক্ত গ্রন্থাগার প্রয়োজন (এর জন্য গুগল, কয়েকটি ভাল বিকল্প রয়েছে)। এটি সবচেয়ে মজবুত তবে পছন্দটি সেট আপ করা সবচেয়ে পরিশীলিত / কঠিন। যদি আপনি নিজেকে numpy
সিনট্যাক্সের মধ্যে সীমাবদ্ধ করে রাখেন তবে থিওানো ভাল পছন্দ হতে পারে।
এখানে সিমপি ব্যবহার করে একটি উদাহরণ দেওয়া হল
In [1]: from sympy import *
In [2]: import numpy as np
In [3]: x = Symbol('x')
In [4]: y = x**2 + 1
In [5]: yprime = y.diff(x)
In [6]: yprime
Out[6]: 2⋅x
In [7]: f = lambdify(x, yprime, 'numpy')
In [8]: f(np.ones(5))
Out[8]: [ 2. 2. 2. 2. 2.]
mpmath
(তারা ঠিক কী করেছিল তা নিশ্চিত নয়)।
আমি সবচেয়ে সোজা-এগিয়ে যাবার উপায়টি ভাবতে পারি তা হ'ল নাম্পির গ্রেডিয়েন্ট ফাংশনটি ব্যবহার করা :
x = numpy.linspace(0,10,1000)
dx = x[1]-x[0]
y = x**2 + 1
dydx = numpy.gradient(y, dx)
এইভাবে, ডায়ডেক্স কেন্দ্রীয় পার্থক্যগুলি ব্যবহার করে গণনা করা হবে এবং numpy.diff এর বিপরীতে y এর সমান দৈর্ঘ্য হবে, যা সামনের পার্থক্য ব্যবহার করে এবং ফিরে আসবে (এন -1) আকারের ভেক্টর।
dx
করার numpy.gradient
পরিবর্তে x
? (২) আমরা নিম্নরূপ পুলিশের শেষ লাইন করতে পারেন: dydx = numpy.gradient(y, numpy.gradient(x))
?
NumPy ডেরিভেটিভস গণনা করতে সাধারণ কার্যকারিতা সরবরাহ করে না। এটি বহুপদীগুলির সাধারণ বিশেষ ক্ষেত্রে পরিচালনা করতে পারে:
>>> p = numpy.poly1d([1, 0, 1])
>>> print p
2
1 x + 1
>>> q = p.deriv()
>>> print q
2 x
>>> q(5)
10
আপনি যদি ডেরাইভেটিভ সংখ্যাসূচকভাবে গণনা করতে চান, তবে আপনি অ্যাপ্লিকেশনগুলির সিংহভাগের জন্য কেন্দ্রীয় পার্থক্য ভাগফল ব্যবহার করে দূরে যেতে পারেন। একক বিন্দুতে ডেরাইভেটিভের জন্য সূত্রটি এমন কিছু হবে
x = 5.0
eps = numpy.sqrt(numpy.finfo(float).eps) * (1.0 + x)
print (p(x + eps) - p(x - eps)) / (2.0 * eps * x)
আপনার যদি ফাংশন মানগুলির x
সাথে সম্পর্কিত অ্যারের সাথে অ্যাবসিসিয়ের একটি অ্যারে থাকে তবে আপনি y
ডেরিভেটিভগুলির সাথে প্রায় অনুমানগুলি গণনা করতে পারেন
numpy.diff(y) / numpy.diff(x)
1 * x**2 + 1
। তারা 2
এটিকে উপরের লাইনে রেখে দিয়েছে কারণ এটি একটি সূচক। দূর থেকে দেখুন।
আপনি যে ব্যবহার করতে চান তা ধরে নিয়ে numpy
, আপনি কঠোর সংজ্ঞা ব্যবহার করে যে কোনও সময়ে কোনও ফাংশনের ডেরাইভেটিভকে সংখ্যাসূচকভাবে গণনা করতে পারেন :
def d_fun(x):
h = 1e-5 #in theory h is an infinitesimal
return (fun(x+h)-fun(x))/h
আপনি আরও ভাল ফলাফলের জন্য প্রতিসম ডেরিভেটিভ ব্যবহার করতে পারেন :
def d_fun(x):
h = 1e-5
return (fun(x+h)-fun(x-h))/(2*h)
আপনার উদাহরণ ব্যবহার করে, পুরো কোডটি দেখতে এমন কিছু হওয়া উচিত:
def fun(x):
return x**2 + 1
def d_fun(x):
h = 1e-5
return (fun(x+h)-fun(x-h))/(2*h)
এখন, আপনি সংখ্যাসূচকভাবে ডাইরিভেটিভটি এখানে খুঁজে পেতে পারেন x=5
:
In [1]: d_fun(5)
Out[1]: 9.999999999621423
আমি অন্য পদ্ধতিটি স্তূপের উপরে ফেলে দেব ...
scipy.interpolate
এর অনেকগুলি ইন্টারপোলটিং স্প্লাইগুলি ডেরিভেটিভ সরবরাহ করতে সক্ষম। সুতরাং, একটি লিনিয়ার স্প্লাইন ( k=1
) ব্যবহার করে স্প্লাইনের ডেরিভেটিভ ( derivative()
পদ্ধতিটি ব্যবহার করে ) একটি সামনের পার্থক্যের সমতুল্য হওয়া উচিত। আমি পুরোপুরি নিশ্চিত নই, তবে আমি বিশ্বাস করি যে কিউবিক স্প্লাইন ডেরাইভেটিভ ব্যবহার করা একটি কেন্দ্রিক পার্থক্য ডেরাইভেটিভের সাথে সমান হবে কারণ এটি কিউবিক স্প্লাইনটি নির্মাণের আগে এবং পরে মানগুলি ব্যবহার করে।
from scipy.interpolate import InterpolatedUnivariateSpline
# Get a function that evaluates the linear spline at any x
f = InterpolatedUnivariateSpline(x, y, k=1)
# Get a function that evaluates the derivative of the linear spline at any x
dfdx = f.derivative()
# Evaluate the derivative dydx at each x location...
dydx = dfdx(x)
গ্রেডিয়েন্ট গণনা করতে, মেশিন লার্নিং সম্প্রদায় অটোগ্রেড ব্যবহার করে:
স্থাপন করা:
pip install autograd
এখানে একটি উদাহরণ:
import autograd.numpy as np
from autograd import grad
def fct(x):
y = x**2+1
return y
grad_fct = grad(fct)
print(grad_fct(1.0))
এটি জটিল ফাংশনগুলির উদাহরণস্বরূপ, মাল্টিভারিয়েট ফাংশনগুলির গ্রেডিয়েন্টগুলিও গণনা করতে পারে।
নির্ভুলতার স্তরের উপর নির্ভর করে আপনি স্বতন্ত্রতার সহজ প্রমাণ ব্যবহার করে এটি নিজেরাই কাজ করতে পারেন:
>>> (((5 + 0.1) ** 2 + 1) - ((5) ** 2 + 1)) / 0.1
10.09999999999998
>>> (((5 + 0.01) ** 2 + 1) - ((5) ** 2 + 1)) / 0.01
10.009999999999764
>>> (((5 + 0.0000000001) ** 2 + 1) - ((5) ** 2 + 1)) / 0.0000000001
10.00000082740371
আমরা আসলে গ্রেডিয়েন্টের সীমা নিতে পারি না, তবে এর মজাদার। যদিও আপনার নজর রাখা দরকার because
>>> (((5+0.0000000000000001)**2+1)-((5)**2+1))/0.0000000000000001
0.0
আপনি ব্যবহার করতে পারেন scipy
, যা বেশ সোজা এগিয়ে রয়েছে:
scipy.misc.derivative(func, x0, dx=1.0, n=1, args=(), order=3)
একটি বিন্দুতে একটি ফাংশন এর নবম ডেরাইভেটিভ খুঁজুন।
আপনার ক্ষেত্রে:
from scipy.misc import derivative
def f(x):
return x**2 + 1
derivative(f, 5, dx=1e-6)
# 10.00000000139778