মাতলাব যেভাবে সংখ্যার একীকরণ বনাম স্কিপি পরিচালনা করে তা নিয়ে আমি কিছুটা হতাশার মুখোমুখি হয়েছি। আমি নীচে আমার পরীক্ষার কোডে নিম্নলিখিত পার্থক্যগুলি পর্যবেক্ষণ করছি:
- মতলব সংস্করণ আমার অজগর সমতুলের চেয়ে গড়ে 24 গুণ দ্রুত গতিতে চলে !
- মতলবের সংস্করণ সতর্কতা ছাড়াই অবিচ্ছেদ্য গণনা করতে সক্ষম, যখন অজগর ফেরত দেয়
nan+nanj
উল্লিখিত দুটি দফার সম্মানের সাথে পাইথনে একই কর্মক্ষমতা পাওয়ার জন্য আমি কী করতে পারি? ডকুমেন্টেশন অনুসারে উভয় পদ্ধতিতে অবিচ্ছেদ্য আনুমানিক জন্য "বৈশ্বিক অভিযোজিত চতুর্ভুজ" ব্যবহার করা উচিত।
নীচে দুটি সংস্করণে কোডটি রয়েছে (পাইথনের সাথে প্রায় একইরকম প্রয়োজন হলেও একটি অবিচ্ছেদ্য ফাংশন তৈরি করা যাতে এটি জটিল ইন্টিগ্রেন্ডগুলি পরিচালনা করতে পারে))
পাইথন
import numpy as np
from scipy import integrate
import time
def integral(integrand, a, b, arg):
def real_func(x,arg):
return np.real(integrand(x,arg))
def imag_func(x,arg):
return np.imag(integrand(x,arg))
real_integral = integrate.quad(real_func, a, b, args=(arg))
imag_integral = integrate.quad(imag_func, a, b, args=(arg))
return real_integral[0] + 1j*imag_integral[0]
vintegral = np.vectorize(integral)
def f_integrand(s, omega):
sigma = np.pi/(np.pi+2)
xs = np.exp(-np.pi*s/(2*sigma))
x1 = -2*sigma/np.pi*(np.log(xs/(1+np.sqrt(1-xs**2)))+np.sqrt(1-xs**2))
x2 = 1-2*sigma/np.pi*(1-xs)
zeta = x2+x1*1j
Vc = 1/(2*sigma)
theta = -1*np.arcsin(np.exp(-np.pi/(2.0*sigma)*s))
t1 = 1/np.sqrt(1+np.tan(theta)**2)
t2 = -1/np.sqrt(1+1/np.tan(theta)**2)
return np.real((t1-1j*t2)/np.sqrt(zeta**2-1))*np.exp(1j*omega*s/Vc);
t0 = time.time()
omega = 10
result = integral(f_integrand, 0, np.inf, omega)
print time.time()-t0
print result
মতলব
function [ out ] = f_integrand( s, omega )
sigma = pi/(pi+2);
xs = exp(-pi.*s./(2*sigma));
x1 = -2*sigma./pi.*(log(xs./(1+sqrt(1-xs.^2)))+sqrt(1-xs.^2));
x2 = 1-2*sigma./pi.*(1-xs);
zeta = x2+x1*1j;
Vc = 1/(2*sigma);
theta = -1*asin(exp(-pi./(2.0.*sigma).*s));
t1 = 1./sqrt(1+tan(theta).^2);
t2 = -1./sqrt(1+1./tan(theta).^2);
out = real((t1-1j.*t2)./sqrt(zeta.^2-1)).*exp(1j.*omega.*s./Vc);
end
t=cputime;
omega = 10;
result = integral(@(s) f_integrand(s,omega),0,Inf)
time_taken = cputime-t
np.vectorize
)। একবারে পুরো অ্যারেতে গণনা করার চেষ্টা করুন। এটি যে সম্ভব নয়, নাম্বা বা সিথনের দিকে নজর দিন, তবে আমি আশা করি পরবর্তীটি প্রয়োজনীয় নয়।
integral
এর ডিফল্ট পরম এবং আপেক্ষিক সহনশীলতা যথাক্রমে 1e-10
এবং 1e-6
। integrate.quad
এই উভয় হিসাবে নির্দিষ্ট করে 1.49e-8
। আমি দেখতে পাই না যেখানে integrate.quad
"গ্লোবাল অ্যাডাপটিভ" পদ্ধতি হিসাবে বর্ণনা করা হয়েছে এবং এটি অবশ্যই ব্যবহৃত (অভিযোজক গাউস-ক্রোনরোড, আমি বিশ্বাস করি) পদ্ধতি থেকে পৃথক integral
। আমি নিজেও "গ্লোবাল" অংশটির অর্থ কী তা নিশ্চিত। এছাড়াও, / বা এর cputime
পরিবর্তে কখনও ব্যবহার করা ভাল ধারণা নয় । tic
toc
time it