में मानक पाश करने के लिए vectorized कोड के साथ अलग परिणाम मैं निम्नलिखित दो कार्य किया है:numpy
def loop(x):
a = np.zeros(10)
for i1 in range(10):
for i2 in range(10):
a[i1] += np.sin(x[i2] - x[i1])
return a
और
def vectorized(x):
b = np.zeros(10)
for i1 in range(10):
b += np.sin(np.roll(x, i1) - x)
return b
हालांकि
, जब मैं दोनों चलाने के लिए, मुझे लगता है कि उनके परिणामों थोड़ा भिन्न होते हैं:
x = np.arange(10)
a, b = loop(x), vectorized(x)
print b - a
मैं:
[ 2.22044605e-16 0.00000000e+00 0.00000000e+00 6.66133815e-16
-2.22044605e-16 2.22044605e-16 0.00000000e+00 2.22044605e-16
2.22044605e-16 2.22044605e-16]
जो बहुत छोटा है, लेकिन मेरे मामले में, सिमुलेशन को प्रभावित करता है। यदि मैं कार्यों से np.sin को हटा देता हूं, तो अंतर गायब हो जाता है। वैकल्पिक रूप से भिन्नता भी दूर हो जाती है यदि एक्स के लिए np.float32 का उपयोग करें, लेकिन यह एक ओडीई का हिस्सा है जिसे एक सॉल्वर द्वारा हल किया जा रहा है जो फ्लोट 64 का उपयोग करता है। क्या इस अंतर को हल करने का कोई तरीका है?
दुर्भाग्य से, जब आप आपरेशनों को पुन: व्यवस्थित की तरह आप किया है, यह मुश्किल (? असंभव) से त्रुटि गोलाई के आदेश पर मतभेद रखने के लिए में प्रवेश। यदि अंतिम समाधान में वास्तव में महत्वपूर्ण अंतर हैं, तो आपको खुद से पूछना शुरू करना होगा कि आपको कम संवेदनशील ओडीई सॉल्वर चुनना है (या यदि आप जिस प्रणाली को हल करने की कोशिश कर रहे हैं, वह अराजक व्यवहार प्रदर्शित करता है जो कुछ प्रकार के मॉडलिंग को असंभव बनाता है) – mgilson