当前位置:首页 > JavaScript

js实现求导

2026-04-03 20:08:33JavaScript

实现数值微分(有限差分法)

在JavaScript中实现求导可以通过数值微分方法近似计算导数。以下是常见的有限差分法实现:

前向差分法

function derivative(f, x, h = 1e-5) {
    return (f(x + h) - f(x)) / h;
}

中心差分法(更高精度)

js实现求导

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)

实现符号微分(解析解)

对于简单表达式,可通过解析方法实现符号微分:

js实现求导

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。

标签: 求导js
分享给朋友:

相关文章

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <htm…

js实现排序

js实现排序

数组排序方法 JavaScript提供了内置的sort()方法用于数组排序。默认情况下,sort()将元素转换为字符串并按照Unicode码点排序。对于数字排序,需传入比较函数。 const num…