1

例如,想象一个这样的函数:

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

使用符号代数,编译器将确定 x = y / 2。更好的是,它会抱怨 int 不足以存储 y / 2 的结果。想象一下这个功能扩展到求解具有约束和/或边界条件的 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 的四精度浮点数,由谓词定义的集合,分段函数的积分。可能负载可以做更多。

这样的事情是可能的,不是吗?我知道您可以使用 Mathematica 或 MatLab 的编程语言函数执行类似的操作,但它们被源代码调用。我希望它被编译器应用于源代码。(这些语言有这种东西吗?我不知道。)当我有借口时,我喜欢在工作中使用 Mathematica,但后来我在 C++ 中得到了看起来很神奇的函数,如果不引用外部函数就毫无意义数学笔记本。我希望能够成为使用一种语言、一种环境的数学家和程序员。这样的事情存在吗?

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,它仍然是此类练习的好语言。Maxima 是在 Lisp 中实现的。我推荐学习 Lisp,即使你最终使用其他语言,你也可以从中学到很多关于编程的知识。

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

于 2013-05-18T06:02:34.957 回答