पायथन साइन और कोसाइन परिशुद्धता - पायथन, matlab, numpy, परिशुद्धता, कोसाइन

अजगर साइन और कोसाइन परिशुद्धता में सुधार कैसे करें? उदाहरण के लिए, मैं एक यादृच्छिक जटिल वेक्टर x के लिए अनुसरण कोड (बस y = cos (acos (x)) की गणना करना चाहता हूं:

import numpy as np
N = 100000
x = np.zeros(N)+1j*np.zeros(N)
for k in range(0,N):
x[k] = np.random.normal(0,500)+1j*np.random.normal(0,500)
y = np.cos(np.arccos(x))

m= np.max(np.abs(x))

print np.max(np.abs(x-y)/m)

y बराबर होना चाहिए एक्स। लेकिन मेरा अंतर लगभग है 1E-9। मुझे लगता है कि बहुत बड़ा है। उदाहरण के लिए मतलबी रिटर्न 1E-15 से कम है उसी परीक्षा के लिए। अजगर परिशुद्धता में सुधार करने का कोई तरीका है? धन्यवाद!

उत्तर:

जवाब के लिए 0 № 1

इसे पढ़ने से पहले: यह एक सही उत्तर नहीं हो सकता है, क्योंकि यह बहुत ही अक्षम है, लेकिन अगर आपको अतिरिक्त प्रिस्क्रिप्शन की आवश्यकता है, तो यह सबसे अच्छा समाधान हो सकता है।

आप एक का उपयोग कर सकते हैं Decimal वर्ग, जहाँ आप अपनी इच्छित किसी भी गणना के साथ गणना कर सकते हैं (यह स्ट्रिंग ऑब्जेक्ट्स का उपयोग करके गणना करता है, पूर्णांक नहीं)।

>>> from decimal import *
>>> getcontext().prec = 30
>>> Decimal(1) / Decimal(7)
Decimal("0.142857142857142857142857142857")

लेकिन समस्या यह है कि आपको अपने ट्रिनोगोमेट्री फ़ंक्शन को लागू करना होगा। सौभाग्य से अजगर वेबसाइट ने उदाहरण प्रदान किए हैं:

https://docs.python.org/3/library/decimal.html#recipes

def cos(x):
"""Return the cosine of x as measured in radians.

The Taylor series approximation works best for a small value of x.
For larger values, first compute x = x % (2 * pi).

>>> print(cos(Decimal("0.5")))
0.8775825618903727161162815826
>>> print(cos(0.5))
0.87758256189
>>> print(cos(0.5+0j))
(0.87758256189+0j)

"""
getcontext().prec += 2
i, lasts, s, fact, num, sign = 0, 0, 1, 1, 1, 1
while s != lasts:
lasts = s
i += 2
fact *= i * (i-1)
num *= x * x
sign *= -1
s += num / fact * sign
getcontext().prec -= 2
return +s

ध्यान दें कि यह आपके प्रोग्राम के निष्पादन समय को प्रभावित करेगा, क्योंकि स्ट्रिंग्स की गणना फ्लोट्स की तुलना में बहुत धीमी है।


जवाब के लिए 0 № 2

अजगर पुनर्स्थापना के बाद समस्या गायब हो गई है। टिप्पणियों के लिए धन्यवाद


संबंधित सवाल
सबसे लोकप्रिय