js实现求导
实现数值微分(有限差分法)
在JavaScript中实现求导可以通过数值微分方法近似计算导数。以下是常见的有限差分法实现:
前向差分法
function derivative(f, x, h = 1e-5) {
return (f(x + h) - f(x)) / h;
}
中心差分法(更高精度)

function derivative(f, x, h = 1e-5) {
return (f(x + h) - f(x - h)) / (2 * h);
}
使用示例:
const f = x => x * x; // 函数f(x) = x²
console.log(derivative(f, 2)); // 近似4.000000000008441(理论值为4)
实现符号微分(解析解)
对于简单表达式,可通过解析方法实现符号微分:

class Differentiator {
static diff(expr, variable = 'x') {
if (typeof expr === 'number') return 0;
if (expr === variable) return 1;
if (Array.isArray(expr)) {
const [op, left, right] = expr;
switch(op) {
case '+': return ['+', this.diff(left, variable), this.diff(right, variable)];
case '-': return ['-', this.diff(left, variable), this.diff(right, variable)];
case '*': return ['+', ['*', this.diff(left, variable), right],
['*', left, this.diff(right, variable)]];
case '/': return ['/', ['-', ['*', this.diff(left, variable), right],
['*', left, this.diff(right, variable)]],
['*', right, right]];
case '^': return ['*', ['*', right, ['^', left, ['-', right, 1]]],
this.diff(left, variable)];
}
}
return 0;
}
}
// 使用示例:对x²+2x求导
const expr = ['+', ['^', 'x', 2], ['*', 2, 'x']];
console.log(Differentiator.diff(expr)); // 输出: ["+", ["*", 2, "x"], 2]
使用数学库实现
利用math.js库进行符号微分:
const math = require('mathjs');
const expr = 'x^2 + 2*x';
const derivative = math.derivative(expr, 'x').toString();
console.log(derivative); // 输出: 2 * x + 2
自动微分实现
基于双数(Dual Number)的自动微分实现:
class Dual {
constructor(real, dual = 0) {
this.real = real;
this.dual = dual;
}
add(b) {
return new Dual(this.real + b.real, this.dual + b.dual);
}
mul(b) {
return new Dual(this.real * b.real,
this.dual * b.real + this.real * b.dual);
}
// 其他运算类似实现...
}
function autoDiff(f, x) {
const xDual = new Dual(x, 1);
return f(xDual).dual;
}
// 使用示例
const f = x => x.mul(x); // f(x) = x²
console.log(autoDiff(f, 3)); // 输出6
注意事项
数值微分方法会受到浮点精度和步长选择的影响。中心差分法通常比前向差分法更精确,但计算量更大。
符号微分能给出精确解析解,但实现复杂表达式规则较困难。对于生产环境,推荐使用成熟的数学库如math.js。






