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
相关产品推荐
相关产品推荐

