1

たとえば、次のような関数を想像してください。

int solveSomeEquation(int y)
{
    y = (int x) * 2;
    return x;
}

シンボリック代数を使用すると、コンパイラは x = y / 2 であると判断します。さらに良いことに、y / 2 の結果を格納するには int では不十分であると不平を言うでしょう。この機能が、制約および/または境界条件を持つ ODE の解決に拡張されることを想像してください。必要に応じて、(実行時に) シンボリックまたは数値メソッドを使用した統合。私は、たとえば、次のようなものを見たいと思っています。

int areaOfUnitSemiCircle()
{
    auto semiCircleFunc = [](double x){ return abs((1 - x^2)^0.5); };
    semiCircleFunc = (auto semiCircleIntegralFunc)'; // single quote means derivative
    return semiCircleIntegralFunc(1) - semiCircleIntegralFunc(-1);
}

単純化して次のようにします。

int areaOfUnitSemiCircle()
{
    return Pi/2;
}

さらに、関数内でローカルに式を単純化できるだけでなく、プログラム全体の最適化を実行できます。数値の安定性を向上させる (浮動小数点エラーの影響を減らす) ために式を再配置したり、別の表現を使用してそれらを完全に削除したりすることもできます。BigInt、IEEE1394 の 4 倍精度浮動小数点数、述語によって定義されるセット、区分関数の統合。おそらくもっと多くのことができるでしょう。

そんなことありえますよね?Mathematica または MatLab のプログラミング言語関数を使用してこのようなことを実行できることは知っていますが、それらはソース コードによって呼び出されます。コンパイラによってソースコードに適用されるようにしたい。(これらの言語にはこの種の機能がありますか? 私にはわかりません.) 私は仕事で言い訳があれば Mathematica を使うのが好きですが, C++ の魔法のように見える関数は外部参照なしでは意味をなさないものになってしまいます. Mathematica ノートブック。1 つの言語、1 つの環境で数学者とプログラマーになれるようになりたいです。そのようなものは存在しますか?

4

1 に答える 1

0

まあ、Maxima [1] は確かに式を構築して操作し、それらから関数を作成することができます。関数も単なる式であるため、式を取得して操作し、関数を作成して関数を呼び出すのは簡単で、これらすべてを特定の値ではなく変数で行います。たとえば、円面積関数は次のとおりです。

(%i1) display2d : false $
(%i2) a(r) := ''(4 * integrate (sqrt (r^2 - x^2), x, 0, r));
Is r positive, negative or zero?
p;
(%o2) a(r):=%pi*r^2
(%i3) a(10);
(%o3) 100*%pi
(%i4) a(h);
(%o4) %pi*h^2

プログラミング言語がそれ自体で機能するという一般的な考え方は、Lisp に端を発しており、Lisp は今でもそのような演習に適した言語です。Maxima は Lisp で実装されています。Lisp を学ぶことをお勧めします。他の言語を扱うことになったとしても、Lisp からプログラミング全般について多くを学ぶことができます。

[1] http://maxima.sourceforge.net

于 2013-05-18T06:02:34.957 に答える