簡體   English   中英

Java:求解符號代數方程

[英]Java: solving symbolic algebraic equations

我無法將此功能添加到我的計算器應用程序中。 這是我的想法:

我想解決: 2x = 5 + 4x

為了解決這個問題,如果我使用外部令牌庫來解析方程,那是沒有問題的,但是由於我的整個程序是圍繞一個分流碼解析器 (EXP4J) 構建的,所以它使事情變得復雜。 你可能會說我可以只在特定情況下使用令牌解析器,但是當你考慮到我有使用 EXP4J 的 FUNCTIONS 時,它變得非常糾結。

因此,雖然我可以通過簡單地在這種特定情況下交替使用令牌解析器來使其適用於2x = 5 + 4x ,但使用 EXP4J 的計算,例如:

2x = 5*exp4jfunc(x + 5,x) + cos(x)完全超出我的范圍。

有沒有人知道如何解決這個問題? 我什至不知道我的卡西歐是如何解決這個問題的,因為它凍結在求解x = 9^x這樣的 x 方程上......

使用symja 庫,您可以像這樣解決您的問題:

package org.matheclipse.core.examples;

import org.matheclipse.core.eval.ExprEvaluator;
import org.matheclipse.core.interfaces.IExpr;
import org.matheclipse.parser.client.SyntaxError;
import org.matheclipse.parser.client.math.MathException;

public class Solve2Example {

    public static void main(String[] args) {
        try {
            ExprEvaluator util = new ExprEvaluator();
            IExpr result = util.evaluate("Solve(2*x==5 + 4*x,x)");
            // print: {{x->-5/2}}
            System.out.println(result.toString());

            result = util.evaluate("Roots(2*x==5+4*x, x)");
            // print: x==-5/2
            System.out.println(result.toString());
        } catch (SyntaxError e) {
            // catch Symja parser errors here
            System.out.println(e.getMessage());
        } catch (MathException me) {
            // catch Symja math errors here
            System.out.println(me.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

您可以查看Roots() 函數的實現,它是如何轉換解析后的 AST 來求解方程的。

我對 exp4j 不是很熟悉……鑒於Expression類似乎沒有提供對解析結構的太多訪問,因此符號方法對於 exp4j 似乎並不真正可行。

您可以嘗試使用 exp4j 代替:

  • 在拆分公式=leftright

  • 建立一個新的方程,它是兩邊的差:

    String diff = "(" + left + ") - (" + right + ")"

  • 使用 exp4j 解析diff

  • 使用帶有setVariable()evaluate()的數值方法(例如割線方法evaluate()來找到解決方案。

無恥的插件:如果你正在考慮使用不同的解析器,看看這個

首先,定義方程的域。 你說的是線性方程、多項式、一般非線性方程、微分方程嗎? 然后定義你的維度:你有一個變量還是多個變量? 最后,選擇合適的求解器(數值、符號、高斯、牛頓等)。

一旦你定義了這個,你需要將 exp4j 的語法樹轉換成求解器所需的格式。 但是,您似乎無法使用 exp4j 執行此操作,因為它不會將表達式的結構公開為 API。

我建議使用適當的 AST。 如果你不能這樣做,你可以在實現中看到內部結構基本上只是一個令牌列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM