You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Olver方法实现中多输出导数函数合并的diff()使用难题求助

用MATLAB合并Olver方法的函数为多输出函数(含自动求导方案)

我懂你现在的需求——原本写了三个分开的函数来处理Olver方法里的原函数、一阶导和二阶导,现在想把它们合并成一个能同时输出这三个结果的函数,还想借助diff()来自动求导,又怕处理不好输入参数影响结果对吧?这就给你两个可行的方案:

方案1:用符号计算+diff()自动求导(省心不手动推导数)

这个方案适合不想手动推导导数的场景,用MATLAB的符号工具箱自动计算导数,再转换成数值函数,封装成多输出函数:

function [f_val, fd_val, fdd_val] = olver_fun(x)
    % 定义符号变量t,用来构建函数表达式
    syms t;
    
    % 1. 定义原函数的符号表达式
    f_sym = t - exp(1/t);
    % 2. 用diff()计算一阶导数和二阶导数的符号表达式
    fd_sym = diff(f_sym, t);
    fdd_sym = diff(fd_sym, t);
    
    % 3. 将符号表达式转换为匿名函数,支持数值输入(包括向量/矩阵)
    f = matlabFunction(f_sym);
    fd = matlabFunction(fd_sym);
    fdd = matlabFunction(fdd_sym);
    
    % 4. 计算输入x对应的函数值与导数值
    f_val = f(x);
    fd_val = fd(x);
    fdd_val = fdd(x);
end

用法示例

调用的时候直接获取三个输出值,和你原来分开调用的结果完全一致:

x0 = 2; % 示例输入
[f, fd, fdd] = olver_fun(x0);

这个方案的好处是不用手动推导导数,避免计算错误,而且自动生成的匿名函数支持数组输入,兼容性很好。

方案2:手动实现导数(数值计算效率更高)

如果你的场景对计算效率要求较高,不想有符号转换的开销,可以直接把三个函数的计算逻辑合并到一个多输出函数里,手动实现导数计算(我帮你补全了二阶导的代码):

function [f_val, fd_val, fdd_val] = olver_fun(x)
    % 原函数值计算(注意用点运算支持数组输入)
    f_val = x - exp(1./x);
    % 一阶导数值计算
    fd_val = 1 + exp(1./x)./(x.^2);
    % 二阶导数值计算(推导后的结果)
    fdd_val = -exp(1./x).*(2.*x + 1)./(x.^4);
end

注意点

这里所有运算都用了点运算(./、.^、.*),确保输入x是向量或矩阵时也能正确逐元素计算,完全不影响输出结果的正确性。

两种方案都能完美实现“合并为单函数多输出”的需求,你可以根据自己的场景选择——追求省心选方案1,追求效率选方案2。

内容的提问来源于stack exchange,提问作者Stuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:27:30