2010-11-13 17 views
5

में मैं Java Embedding Plugin (JEP) की तरह कुछ है कि एक गणितीय सूत्र (स्ट्रिंग) का मूल्यांकन करने और उत्तर वापस दे सकते हैं खोजने की कोशिश कर रहा हूँ नंबर पर।गणितीय अभिव्यक्ति (स्ट्रिंग) जावा

लेकिन यह भी एक चर की गणना करना चाहिए, उदाहरण के लिए: (25 + 36 + x) * 2 = 25 देना चाहिए: x = -11

एक छोटी सी की तरह http://www.wolframalpha.com/, लेकिन ऐसा नहीं है कि बहुमुखी होना चाहिए , और यह ऑफलाइन काम करना चाहिए।

ओपन सोर्स को प्राथमिकता दी जाती है।

मुझे इसकी छोटी कैलकुलेटर परियोजना, http://sourceforge.net/projects/calex/ के लिए इसकी आवश्यकता है।

+0

यह बंद नहीं किया जाना चाहिए, क्योंकि वह एक समीकरण को हल करना चाहता है और की तलाश में नहीं है जावास्क्रिप्ट eval() की तरह कुछ। – stacker

+2

जब तक आप अपने आप को समीकरण के बहुत कम रूपों तक सीमित नहीं कर रहे हैं (क्वार्टिक तक रैखिक कहें), तो यह एक प्रमुख परियोजना होगी। http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems में कुछ जावा हैं। –

उत्तर

3

इसे Arithmetic evaluation कहा जाता है। इसे लागू करने का सबसे आसान तरीका एडस्गर डिजस्ट्रा Shunting-yard_algorithm का उपयोग कर रहा है।

shunting-यार्ड एल्गोरिथ्म को पार्स गणितीय समीकरणों इन्फ़िक्स संकेतन में निर्दिष्ट के लिए एक तरीका है। इसका उपयोग रिवर्स पोलिश नोटेशन (आरपीएन) या अमूर्त वाक्यविन्यास पेड़ (एएसटी) के रूप में आउटपुट का उत्पादन करने के लिए किया जा सकता है। एल्गोरिदम का आविष्कार एडस्गर डिजस्ट्रा द्वारा किया गया था और "शंटिंग यार्ड" एल्गोरिदम नाम दिया गया था क्योंकि इसका ऑपरेशन रेलरोड यार्ड के समान रेलवे जैसा दिखता है। आरपीएन के मूल्यांकन की तरह, शर्टिंग यार्ड एल्गोरिदम स्टैक-आधारित है। इन्फिक्स अभिव्यक्ति गणितीय नोटेशन के रूप में सबसे अधिक लोगों का उपयोग किया जाता है, उदाहरण के लिए 3 + 4 या 3 + 4 * (2-1)। रूपांतरण के लिए दो टेक्स्ट चर (तार) हैं, इनपुट और आउटपुट। स्टैक भी है जो ऑपरेटरों को अभी तक आउटपुट कतार में जोड़ा गया है। कनवर्ट करने के लिए, प्रोग्राम प्रत्येक प्रतीक को क्रम में पढ़ता है और उस प्रतीक पर आधारित कुछ करता है।

लेकिन मैंने कुछ स्टैक ओवरफ्लो उपयोगकर्ता ब्लॉग पर जो कुछ खोज रहे हैं, उसे सटीक समाधान देखा है, लेकिन मुझे पता याद नहीं है (यह 'कोड बंदरवाद' जैसा था)। यह हल्का वर्ग था, जिसे आप एप्लेट्स में उपयोग कर सकते हैं (आप स्थिरांक को परिभाषित कर सकते हैं और मूल्यों को रीसेट कर सकते हैं)।

संपादित करें: यह मिला: http://tech.dolhub.com/Code/MathEval

एक रेखीय पुनरावर्ती मठ मूल्यांकनकर्ता

यह गणित अभिव्यक्ति मूल्यांकनकर्ता एक की जरूरत से बाहर पैदा हुआ था एक छोटे पदचिह्न और कुशल समाधान जो मूल्यांकन कर सकें पूर्व-संकलन की आवश्यकता के बिना मनमाने ढंग से अभिव्यक्तियों को कुशलतापूर्वक कुशलतापूर्वक। मुझे कुछ ऐसा चाहिए जो वैरिएबल के साथ मूल गणित करे, जैसे अभिव्यक्ति: "टॉप + 2", "नीचे -2" और "(दाएं + 1-बाएं)/2"।

अनुसंधान इंटरनेट पर काफी अच्छा समाधान की एक संख्या है, जो सभी पार्स पेड़ बनाने (जो समझ में आता है) इर्द-गिर्द घूमती कर दिया। समस्या यह थी - वे सभी बदकिस्मत थे, और मैं सिर्फ गणित के लिए अपने एप्लेट आकार में 100K जोड़ने का जोखिम नहीं उठा सकता था। इसलिए मैंने समस्या के लिए एक रैखिक रिकर्सिव समाधान के बारे में सोचना शुरू कर दिया। अंतिम परिणाम एक स्वीकार्य प्रदर्शन करने वाला सिंगल क्लास है जिसमें बाहरी निर्भरता नहीं है, जिसका वजन 10 कीबी है।

+2

मेरे मूल्यांकनकर्ता को छोड़कर * समाधान * उदाहरण में उदाहरण के समान समीकरणों को हल नहीं किया जाएगा जहां चर अज्ञात है। यह केवल परीक्षण और त्रुटि का उपयोग करके एक्स के विभिन्न मान ले सकता है और दिए गए उत्तर तक 25 (36 + 36 + x) * 2' का मूल्यांकन कर सकता है। –

+1

आपको समीकरण को एक तरफ एक्स प्राप्त करने के लिए स्वयं को जोड़ना होगा बराबर: मुझे लगता है कि '(25 + 36 + x) * 2 = 25' =>' x = 25/2- (25 + 36) ', अगर मैं अपने गणित को सही तरीके से याद करता हूं, तो मूल्यांकन करता है (सही ढंग से) -48.5, नहीं - 1 1। –

+0

ठीक है, हाँ। वुल्फ्राम अल्फा अमान्य इनपुट को ठीक करने के लिए कुछ फैंसी एआई का उपयोग करता है, और '(25 + 36 + x) * 2 = 25' 'हल हो जाता है [(25 + 36 + x) * 2 == 25, x]', इसलिए मैंने माना, कि उसे 'रैखिक सिस्टम सॉल्वर' लिखने की ज़रूरत है या इसे मैन्युअल रूप से करें। – Margus

0

मैं Apache License 2.0 की शर्तों के तहत Dijkstra's Shunting Yard एल्गोरिथ्म के आधार पर एक अभिव्यक्ति मूल्यांकनकर्ता जारी की है,:

http://projects.congrace.de/exp4j/index.html

+0

अच्छा लग रहा है :), मैं इसे अपने प्रोजेक्ट में जोड़ सकता हूं। हालांकि एक कैलकुलेटर के लिए जावा का बूटस्पीड धीमा है। शायद मुझे इसे संशोधित करने और सी ++ में शुरू करने की आवश्यकता है। – Berty