मैं DIY भौतिक विज्ञान के बारे में जानने के लिए शुरू कर रहा हूँ, और मैं सबसे बुनियादी स्तर पर एकीकरण को लागू करने के बारे में एक सवाल (यानी यह है है नहीं एक यूलर बनाम RK4 प्रश्न)।
मेरे द्वारा दिए गए लगभग हर उदाहरण में कुछ integrate()
फ़ंक्शन होते हैं जो अंतिम अपडेट के बाद टाइमस्टेप प्राप्त करते हैं, और अंतिम अपडेट के बाद से त्वरण (और / या वेग और / या स्थिति) को अपडेट करते हैं।
सबसे सरल रूप में: position += velocity * deltaTime
हालाँकि, मुझे समझ में नहीं आता है कि जब यह किसी फ़ंक्शन को बदलकर आसानी से प्राप्त किया जा सकता है तो यह इस तरह क्यों जमा होता है । उदाहरण के लिए: getPosition = makeNewFunction()
जो कुछ हस्ताक्षर कर सकता है, उस पर हस्ताक्षर कर सकता है Time -> Position
, और उस फ़ंक्शन के आंतरिक कामकाज को उपयुक्त गणितीय सूत्र के माध्यम से उत्पन्न किया जाता है।
इस तरह, कोई संचय नहीं है ... जब भी स्थिति को प्राप्त करने की आवश्यकता होती है, तो वह उस फ़ंक्शन को वर्तमान समय के साथ कॉल करता है।
मेरी नौसिखिया समझ यह है कि यह उन त्रुटियों से भी बचना होगा जो संचय से आती हैं ... इसलिए यह काम क्यों नहीं करता है, मैं क्या याद कर रहा हूं?
(fwiw मैं था एक साथ इस विचार है की अवधारणा का मूल प्रमाण डाल यह भी एक ही समय में कुछ अन्य बातें परीक्षण है, हालांकि, तो यह साफ उदाहरण नहीं है: https://github.com/dakom/ball-bounce-frp )
EDIT 1: जैसा कि टिप्पणियों में बताया गया है, यह इंगित करना महत्वपूर्ण है कि मैंने अभी तक त्वरण को बदलने के बारे में नहीं सीखा है, या झटके और अन्य चीजों से निपटना है जो निरंतर त्वरण की तुलना में उच्च-क्रम एकीकरण की आवश्यकता होती है।
EDIT 2: यहाँ विचार का कुछ मूल नमूना कोड है, और छद्म जावास्क्रिप्ट सिंटैक्स - ध्यान दें कि getKinematicPosition
इसे आंशिक रूप से लागू किया गया है, इसलिए यह सिर्फ समय -> स्थिति का एक नया कार्य लौटा रहा है:
मैं यहाँ स्थिति के लिए चिपका रहा हूँ, लेकिन यह कुछ और हो सकता है, जैसे getVelocity
, मुझे लगता है ...
getKinematicPosition = initialVelocity => acceleration => time =>
((.5 *acceleration) * (time * time)) + (initialVelocity * time);
getPosition = getKinematicPosition ([0,0,0]) (GRAVITY);
onTick = totalTime => {
position = getPosition (totalTime);
onCollision = () => {
getPosition = changeTheFunction(totalTime);
//changeTheFunction uses totalTime to base updates from 0
//it could use getKinematicPosition or something else entirely
}
}