Программа для решения уравнений java
I need a library to be able to parse an equation an give me the result giving the inputs.
For example something like this:
And evaluates to: 6
Is there any kind of library for java that can do that for me?
I don't think there is a prewritten library for that, although honestly I don't think it would really be that hard for you to write yourself.
What mathematical functions are you trying to preform? Java can evaluate 2+1+3 . Therefore unless your trying to do high level math, it's really just some string manipulation, and then have java evaluate the equation. Unless I misunderstand your question.
@Dartoxian - writing an equation parser that handles anything more than a couple of simple formats would in fact be very hard
I am trying to define some formula in my application in order to change it dynamically through some external property. For example maybe today my formula is just "x + y + z" but then someone might want to change it to "x ^ 2 * y / z".
Actually it's not very hard. You convert to postfix notation and then calculate using a stack. I remember having to do that as a homework assignment to learn lex/yacc.
5 Answers 5
You could make use of Java 1.6's scripting capabilities:
For more complex expressions, JEP is a good choice.
Good solution. I agree that I think all he has to do is some string manipulation and then evaluate the result. I didn't know you could do it this easily though :) +1
i tried this too for a while, but evaluating as a javascript expression is quite, quite slow. so if you're doing lots of calculations this might not be the best possible solution
Thanks for saving me lots of time for coding an equation parser; although Nashorn JavaScript engine has been removed from Java in JDK 15 and later, I can still use other JavaScript engines such as Mozilla Rhino, which was the default JavaScript engine before JDK 8's introduction of Nashorn.
There's also exp4j, an expression evaluator based on Dijkstra's Shunting Yard. It's freely available and redistributable under the Apache License 2.0, only 25kb in size and quite easy to use.
There's also a facility to use custom functions in exp4j.
Piece of advice: do not post the same answers over and over again to promote your library, as that can be seen as annoying and they will be flagged as spam. If it is really good, you shouldn't need to do that at all, your happy users will spread the word for you. Cheers.
well im answering questions, in my mind that's not spamming, even if the same answer is applicable to different questions. Or do you think the answer is out of context and not helpful?
I was just warning you that this answer was already flagged as repeated content. And as you are clearly not a spammer, I think it would be a shame that you were tagged as such. Regards.
Try mXparser, below you will find usage example:
Here the advantage of mXparser is that mXparser pre-compiles expression only once, and then, after arguments values changing, calculation is done very fast.
Additionally - this software is using mXparser as well - you can learn the syntax Scalar Calculator app.
If you want high performance, I advise against using exp4j as the CogitoLearning classes are about 2600 times faster than exp4j (tested on 1 mln iterations), yes you read that right.
Often, simple expressions will suffice for business applications. Hence, the library created by CogitoLearning is probably a better choice.
Note that: test case is not entirely pure as for evaluating JavaScript performance as I did not use a prebuilt expression for that case.
Benchmarking code used:
Note: exp4j is slow in this case because the expression is built during each iteration. When setup properly, exp4j is faster than Cogito when solving large equations that have several variables with changing/updated values during each evaluation iteration.
Eight years into the future from when this question was asked: If you don't want to re-invent the wheel, there are many exotic math parsers out there.
There is one that I wrote years ago which supports arithmetic operations, equation solving, differential calculus, integral calculus, basic statistics, function/formula definition, graphing, etc.
Its called ParserNG and its open-source.
Evaluating an expression is as simple as:
Or using variables and calculating simple expressions:
Or using functions:
Or to evaluate the derivative at a given point(Note it does symbolic differentiation(not numerical) behind the scenes, so the accuracy is not limited by the errors of numerical approximations):
Which differentiates x^3 * ln(x) once at x=3. The number of times you can differentiate is 1 for now.
Статья посвящена реализации алгоритма Гаусса для решения системы линейных алгебраических уравнений на языке Java.
Теоретические сведения
Рассмотрим математическую теорию. Система линейных уравнений может иметь одно решение, бесконечно много решений или же быть несовместной (не иметь решений). Не все методы решения СЛАУ могут справится с вторым случаем, когда система имеет бесконечно много решений. Например, метод Крамера и матричный метод не применимы, но метод Гаусса вполне можно использовать.
Алгоритм можно условно разделить на два этапа:
Реализация
Начнем с постановки задачи:
- нам нужно создать программу, реализующую систему линейных уравнений в виде некоторой структуры данных, используя приемы обобщенного программирования. Система должна содержать коэффициенты производного типа от класса Number (т.е. Float, Integer, Double и т.д.)
- Запрограммировать алгоритм, который получив на вход структуру данных системы образует нули ниже главной диагонали
Здесь все должно быть ясно, N некоторый наследник Number'а, T — некоторый тип, реализующий данный интерфейс (рекурсивные дженерики). Метод addEquation(T item) позволяет прибавить каждый элемент уравнения item к каждому своему элементу. Остальные методы работают аналогично.
Теперь рассмотрим класс системы уравнений. Как видно в листинге ниже, он дженеризирован так же, как и интерфейс Gauss и содержит методы для удобного доступа к приватному списку содержащих в себе уравнений.
Теперь можно приступать к реализации «частного случая» структуры уравнения. Создадим класс MyEquation, реализующий наш интерфейс. Пусть наследником Number'а будет сверхточный класс Float (на практике лучше брать Double). Обратите внимание, что в методе addEquation(MyEquation item) используется объект класса ListIterator, позволяющий изменять элементы перебираемого списка.
Теперь имеем полноценную структуру данных, реализующую систему уравнений. Составим алгоритм который будет принимать некоторый объект, реализующий интерфейс Gauss, затем вызывая нужные методы приведет матрицу к нужному виду.
Алгоритм простой, найти нужный коэффициент, домножить на него i-ю строку (i=0..n-1), и прибавить ее к j-й строке (j=i..n). Заметьте, алгоритм не знает как именно реализуются методы findCoefficient, mul и addEquation, это придает коду бОльшую гибкость, т.к. при потребности изменить способы манипуляции уравнениями (строками), будут изменены только реализации трех вышеупомянутых методов, а главный алгоритм останется нетронутым.
Почти все. Осталось запустить это все в методе main:
Запустим это чудо, что бы проверить корректность работы…
Это все. Исходники можно скачать на github'е.
Вывод
Метод Гаусса не очень поддается обобщенному программированию (как видите обратный ход выполнен отдельно), однако вышла своеобразная реализация которая, надеюсь, поможет кому то лучше разобраться в искусстве использования интерфейсов и дженериков.
В этой статье мы рассмотрим алгоритм решения квадратного уравнение на Java.
Что такое квадратное уравнение
Квадратно уравнение – это уравнение вида:
Для вычисления значения x мы сначала вычислим дискриминант по формуле:
Далее, если значение дискриминанта больше нуля, вычислим корни уравнения по формулам:
Иначе, если дискриминант равен нулю, единственное значение x вычислим по формуле:
Иначе, если дискриминант меньше нуля, данное уравнение не имеет решения.
Реализация алгоритма решения квадратного уравнения
Вначале вычитаем исходные данные a, b и c:
Затем вычислим дискриминант:
На основании значения дискриминанта вычислим корни уравнения, если таковые имеются:
Проверка
Теперь проверим программу в действии. Для следующих входных данных программа должна выдать такой результат:
Результат работы программы:
Исходный код
Полный исходный код программы:
Заключение
Мы реализовали программу для решения квадратного уравнения. Вводные данные считываются с помощью Scanner.
Практические задачи по Java — для курсов и прочих занятий
Несколько вводных слов
Последние несколько лет я читаю курс по программированию на Java. Со временем он менялся — то добавлялись, то выкидывались разные части, менялась последовательность тем, менялся подход к построению плана самих занятий, и так далее. То есть, курс совершенствовался. Одной из основных проблем, возникших при подготовке курса — это задачи. О них и пойдёт речь.
Дело в том, что каждое моё занятие состоит из двух частей. На первой я выступаю в роли лектора — рассказываю с примерами кода о какой-то новой теме (классы, наследование, дженерики и так далее). Вторая часть — практическая. Очевидно, что нет смысла просто рассуждать о программировании, надо программировать. Приоритет на занятиях — решение задач, то есть программирование чего-то как-то. Программирование на занятиях отличается от программирования дома, так как на занятиях можно задать вопрос, показать код, получить быструю оценку кода, комментарии по улучшению, исправлению написанного. Очень легко было найти задачи для самых первых занятий. Задачи на циклы, условные операторы, и ООП (к примеру, написать класс «Собака» или класс «Вектор»). Сервисы вроде leetcode позволяют даже проверить правильность решения таких задач сразу, онлайн. Но какие задачи дать студентам на занятии, которое было посвящено коллекциям? Потокам? А аннотациям? За несколько лет я придумал, или переработал несколько таких задач, и эта статья, по сути, является сборником этих задач (к некоторым задачам прилагается решение).
Конечно, все задачи уже где-то появлялись. Однако, эта статья ориентирована на преподавателей курсов по программированию (для языков, похожих на Java, большинство задач подойдёт), или тех, кто преподаёт программирование частным образом. Эти задачи можно использовать «из коробки» на своих занятиях. Изучающие Java тоже могут попробовать решать их. Но такие решения требуют сторонней проверки и оценки.
Некоторые самые простые задачи, которые уже десятилетия все используют, я тоже включил в эту статью. Пожалуй, для того, чтобы не начинать сразу с абстрактных классов.
Подскажите пожалуйста. Правильно ли написан код квадратного уравнения работая с консолью или можно его переделать произвести модернизацию кода. Можно пример правильного кода квадратного уравнения.
Решение квадратного уравнения
Решить квадратное уравнение. Ввод коэффициентов организовать с помощью диалогового окна. По.
Решение квадратного уравнения
Пользователь вводит коэффициенты квадратного уравнения. Вывести на экран корни уравнения. Если.
Решение квадратного уравнения
Помогите пожалуйста! Не могу найти в чем проблема, все работает, но в ответе вместо нужных корней.
Да вроде нормально всё. Если оно компилится и работает - то всё правильно, потому как в логике ошибок нет
Какой лучше цикл использовать для повторения while или for . Например если ввел не правильное значение то программа останавливается, а после повторного ввода правильных данных программа продолжала работать.
При этом ещё желательно добавить условие выхода, но это несколько усложнит Ваш код. Вам тогда надо будет читать nextChar() или что-то навроде того, и проверять на соответствие заранее заданному символу (например 'q'), и если совпало - выходить, далее преобразовывать к вещественному методом Double.parseDouble(с), и если словили исключение - тоже выходить.
Или даже ещё проще - не поймали исключение - продолжаем, значит, введено число, если исключение было, т.е. ввели любой другой символ - выходим.
Выход делается так:
Ну например так. Не нравится c, можете сделать quit командой для выхода, а любые другие строки игнорировать, т.е. продолжать работу. Кстати, можно вместо System.exit(0) сделать break - тогда можно и сканер закрыть уже после цикла. Как вариант)
Подскажите у меня еще вот такой вопрос. Теперь я хотел попробовать написать этот код с конструктором или методом что для это лучше использовать?
Вы некорректно ставите вопрос. Вы хотите сделать класс? Тогда скорее всего у него будет конструктор, будут и обычные методы. Только здесь задача довольно простая, и я если честно даже не знаю, как из этого класс можно сделать. Можно сделать просто класс без полей с одним методом и пустым конструктором, но это ж неинтересно.
Вы подумайте - у Вас есть данные, которые нужно хранить между вызовами (сеансами работы)? То есть между решением разных уравнений, проще говоря? Если окажется, что такие есть, тогда делайте для них поля. Ещё из идей могу предложить сделать отдельный метод для вывода результатов в файл.
Решение квадратного уравнения через потоки
Здравствуйте, помогите, пожалуйста, написать код для расчета корней квадратного уравнения через.
Решение квадратного уравнения через теорему Виета
Сделайте программу решающую квадратное уравнение через теорему Виета: x^2+4x+2=0 v1=x1+x2=-b.
Решение квадратного уравнения: выбросить исключение, если дискриминант меньше 0
Даны коэффициенты a,b,c уравнения ax2+bx+c=0. Найти решение. Задачу вроде бы решил. Хочу добавить.
Программа для решения квадратного уравнения
Не получается реализовать. Ввести квадратное уравнение, в виде "a+b+c=0" и решить его. Я.
Читайте также: