让我们假设您可以将程序表示为数学函数,这是可能的。该函数的一阶导数的程序表示如何?有没有办法将程序转换为“衍生”形式,这是否有意义呢?
答案 0 :(得分:7)
是的,它确实有意义,它被称为自动差异化。有一两个实验编译器可以做到这一点,例如NAGware's Differentiation Enabled Fortran Compiler Technology。关于这个主题有很多研究论文。我建议你去谷歌搜索。
答案 1 :(得分:6)
首先,尝试获得纯函数的导数(一个不影响外部状态并为每个输入返回完全相同的输出)是有意义的。其次,许多编程语言的类型系统涉及许多步骤函数(例如整数),这意味着你必须让你的程序在连续函数方面工作才能获得有效的一阶导数。第三,获得任何函数的导数包括将其分解并以符号方式对其进行操作。因此,如果不了解函数的运算方式,就无法得到函数的导数。这可以通过反思来实现。
如果编程语言支持闭包(即嵌套函数和将函数放入变量并返回它们的能力),则可以创建导数近似函数。以下是从http://en.wikipedia.org/wiki/Closure_%28computer_science%29获取的JavaScript示例:
function derivative(f, dx) {
return function(x) {
return (f(x + dx) - f(x)) / dx;
};
}
因此,您可以说:
function f(x) { return x*x; }
f_prime = derivative(f, 0.0001);
此处f_prime
将近似function(x) {return 2*x;}
如果编程语言实现了高阶函数和足够的代数,则可以在其中实现实数导数函数。那真的很酷。
答案 2 :(得分:5)
答案 3 :(得分:2)
如何定义程序的数学函数?
导数表示函数的变化率。如果您的函数不是连续的,那么它的大部分域名都是will be undefined。
答案 4 :(得分:2)
我只想说这没有多大意义,因为程序比数学函数更抽象,更“无规则”。由于输入随着输出的变化而衡量输出的变化,因此肯定有一些程序可以应用。 但是,您需要能够以数字方式量化输入/输出。
由于输入/输出都是数字的,因此可以合理地假设您的程序表示或操作类似于数学函数或一系列函数。因此,您可以轻松地表示衍生物,但它与将函数的数学导数转换为计算机程序没有什么不同。
答案 5 :(得分:0)
如果程序被表示为分布(Schwartz),那么你有一些派生概念,假设测试函数模拟你的后置条件(你仍然可以采取限制来获得特征函数)。例如,作业x:=x+1
与Dirac分布\delta_{x_0+1}
相关联,其中x_0
是变量x
的初始值。但是,我不知道\delta_{x_0+1}'
的计算含义是什么。
答案 6 :(得分:-2)
我想知道,如果你试图“衍生”的程序使用某种形式的heursitics怎么办?那怎么可以得出呢?
半开玩笑地说,我们都知道所有真正的程序至少使用rand()。