2

Processingで複素数を変換するプログラムを書いています。ただし、入力文字列を取得し、複雑な変数を使用して変換を計算する方法が必要です。例えば:

1/(z+1)
(z^2)/(z/2)

ここで、z は複素数です。ここで、JEP といくつかのを見てきましたが、実際に z を変数として入力できるかどうかはわかりません (いずれにしても無料ではありません)。これを行うために使用できる Java 用の式パーサー (古いバージョンの Java を使用し、ジェネリックを持たない処理で動作するもの) はありますか?

ない場合は、作成方法の基本を教えてもらえますか?

4

7 に答える 7

2

PhiLo が述べたように、ジェネリックを使用できます。この処理スケッチを試してください:

import java.util.*;
java.util.List<String> list = Arrays.asList("a", "b", "c");
textFont(loadFont("UMingCN-30.vlw"));
for(int i = 0; i < list.size(); i++) {
  text(list.get(i), 5, int(i*30)+30);
}

また、JEP の非商用バージョン (GPL) も利用できます。ここからダウンロードして、Processing クラスパスに追加 (インポート) します。成功したら、次のように JEP を使用できます。

void setup() {
  org.nfunk.jep.JEP parser = new org.nfunk.jep.JEP();
  parser.addComplex();
  try {
    parser.parseExpression("(1+2*i) + (3+8*i)");
    println(parser.getComplexValue());
  } catch(Exception e) {
    e.printStackTrace();
  }
}

(期待される)出力を生成します:(4.0、10.0)

于 2009-09-19T12:39:53.073 に答える
1

これを見てください: http://bracer.sourceforge.netこれは私が実装した shunting-yard アルゴリズムで、このパーサーは複素数をサポートしています。

于 2012-03-10T11:13:26.897 に答える
0

簡単な数式パーサーへのリンクは次のとおりです(64行):http://javadots.blogspot.com/2008/11/arithemetic-expressions-solver-in-64.html

あなたのニーズをサポートするためにそれを微調整することはそれほど難しいことではありません

于 2009-09-19T13:04:17.117 に答える
0

ここにクレイジーな解決策があります: Java には JavaScript エンジンが組み込まれています (Processing からアクセスできると思います)。ここで、複素数を扱う JavaScript クラスを作成します (ここからコピーします)。次に、ここで指定されているように、数学演算子をオーバーロードします。その後、この文字列を Java から評価することができます。それはクレイジーで、うまくいくかどうかわかりません(javascriptを知りません)。式を解析せずに、より簡単な解決策を見つけることができるかもしれません。

于 2009-09-19T04:49:44.977 に答える
0

Apache Common Mathを使用します。使い方はとても簡単です。

実数部と虚数部の両方を初期化できます。文字列から初期化することもできます。虚数で実行できるさまざまな操作をサポートしています。

いくつかの一般的な操作を行うためのコードの例を次に示します。

package complex;
import static java.lang.String.format;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.math3.complex.Complex;
import org.apache.commons.math3.complex.ComplexFormat;
public class Do 
{
    public static void main(String[] args) 
{
     ComplexFormat format = new ComplexFormat();
    Complex lhs = new Complex(1.0, 3.0);
    Complex rhs = new Complex(2.0, 5.0);

    Complex answer = lhs.add(rhs);       // add two complex numbers
    System.out.println("Add : "+ format.format(answer));
    answer = lhs.subtract(rhs);  // subtract two complex numbers
    System.out.println("Subtract : "+ format.format(answer));
    answer = lhs.conjugate();
    System.out.println("Conjgate : "+ format.format(answer));
    double d = lhs.abs();
    System.out.println("Absolute : "+d);
    Complex first  = new Complex(1.0, 3.0);
    Complex second = new Complex(2.0, 5.0);

    answer = first.log();        // natural logarithm.
            System.out.println("Logarithm : "+ format.format(answer));
    answer = first.cos();        // cosine
            System.out.println("Cosine : "+ format.format(answer));
    answer = first.pow(second);  // first raised to the power of second
            System.out.println("Power : "+ format.format(answer));

            Complex z = new Complex(2.0,2.0);
            Complex z1 = z.reciprocal();
            System.out.println("Recipocal : "+ format.format(z1));

            System.out.println("Absoltue of 2+2i is "+z.abs());
            System.out.println("Argument of 2+2i is "+z.getArgument());

    Complex r = new Complex(6.3,9.6);
    String conj = format.format(r.conjugate());
    String reci = format.format(r.reciprocal());

    System.out.println("Conjugate : "+conj+" Recipocal : "+reci);

    //answer = lhs.abs();          // absolute value
    //answer = lhs.conjugate(rhs); // complex conjugate

    //make complex to string

    ComplexFormat format = new ComplexFormat(); // default format
    Complex c = new Complex(1.1111, 2.2222);
    String s = format.format(c); // s contains "1.11 + 2.22i"
    System.out.println(s);

    //make string to complex

    String z = "2.5+3.6i";
    Complex e = format.parse(z);
    System.out.println(e);

}    
}

別のオプションが必要な場合は、別の選択肢がFrAidです。

于 2016-04-20T21:24:14.327 に答える
0

私は(そして実際に)手動で解析テーブルを作成し、単純な LR または LALR パーサーを使用してそれを処理します。削減では、計算を実行できます。これの利点の 1 つは、「言語」または受け入れ可能な入力を簡単に変更できることです。

于 2009-09-19T02:43:38.240 に答える