在MATLAB中求导主要有两种方法:符号求导和数值求导。以下是具体方法及示例:
一、符号求导
适用于符号函数,使用`diff`函数进行精确计算。
1. 基本语法
```matlab
syms x; % 声明符号变量
f = x^2 + sin(x); % 定义符号函数
df = diff(f, x); % 对x求导
disp(df); % 输出结果:2*x + cos(x)
```
2. 高阶导数与偏导数
n阶导数:`diff(f, n)`,例如二阶导数`diff(f, 2)`
多元函数偏导数:`diff(f(x1, x2), x2)`,例如对`f(x1, x2) = sin(x1) + x2^2`求`x2`的偏导数
3. 示例
```matlab
% 一阶导数
syms x
f = 2*x + cos(x);
df = diff(f, x);
disp(df); % 输出:2 - sin(x)
% 二阶导数
df2 = diff(f, 2);
disp(df2); % 输出:-cos(x)
% 偏导数
syms x1 x2
f = sin(x1) + x2^2 + exp(x3);
dfx2 = diff(f, x2);
disp(dfx2); % 输出:2*x2
% 多元函数高阶偏导数
dfx2x2 = diff(diff(f, x2), x2);
disp(dfx2x2); % 输出:2
```
二、数值求导
适用于已知函数值的场景,使用有限差分法(如中心差分、前向差分、后向差分)或`gradient`函数。
1. 中心差分法
```matlab
function df = central_diff(f, x, h)
df = (f(x + h) - f(x - h)) / (2 * h);
end
```
示例:对`f(x) = x^2`在`x=0`处求导
```matlab
f = @(x) x.^2;
h = 0.01;
df = central_diff(f, 0, h);
disp(df); % 输出:2.002
```
2. 前向/后向差分法
前向差分:`df = (f(x + h) - f(x)) / h;`
后向差分:`df = (f(x) - f(x - h)) / h;`
注意:中心差分法精度更高,但需选择合适的步长`h`。
3. `gradient`函数
适用于向量值函数,计算数值梯度
```matlab
x = [1 2 3 4 5];
y = [2 4 1 3 5];
dydx = gradient(y, x);
disp(dydx); % 输出:[ 1.0000 1.0000 -1.0000 1.0000 1.0000]
```
注意事项:
数值方法精度与步长`h`相关,`h`越小精度越高,但计算量增加
`gradient`函数内部使用中心差分法
选择方法建议
符号求导:用于理论分析或函数表达式已知的情况
数值求导:用于实验数据拟合、复杂函数近似或无法解析求解的场景
通过以上方法,可灵活应对不同类型的求导需求。