MATLAB数值导数计算与可视化:使用多项式拟合、diff函数和解析导数
以下代码使用MATLAB实现了三种方法求函数的数值导数,并在同一个坐标系中绘制出f'(x)的图像:
% 函数定义
f = @(x) sin(x);
df_exact = @(x) cos(x);
% 假设点
x0 = pi/4;
% (1) 使用多项式拟合方法
p = polyfit([-2*pi:0.1:2*pi], f([-2*pi:0.1:2*pi]), 5); % 5次多项式拟合
dp_poly = polyder(p); % 多项式导数
dp_value_poly = polyval(dp_poly, x0); % 在假设点的导数值
% (2) 使用diff函数
h = 0.1;
x = x0 - 2*h:h:x0 + 2*h;
y = f(x);
dy = diff(y) / h; % 数值导数
dx = x(2:end);
dp_value_diff = interp1(dx, dy, x0); % 在假设点的导数值
% (3) 使用解析导函数
dp_exact = df_exact(x0); % 解析导函数值
% 绘图
figure;
hold on;
title('导数图像');
xlabel('x');
ylabel('f'(x)');
% 绘制f'(x)的图像
x_vals = -2*pi:0.01:2*pi;
y_vals = df_exact(x_vals);
plot(x_vals, y_vals, 'b', 'DisplayName', '解析导数');
% 绘制假设点
scatter(x0, dp_value_poly, 'r', 'filled', 'DisplayName', '多项式拟合方法');
scatter(x0, dp_value_diff, 'g', 'filled', 'DisplayName', '直接求导数方法');
scatter(x0, dp_exact, 'm', 'filled', 'DisplayName', '解析导数');
legend('Location', 'northwest');
hold off;
这段代码首先定义了函数f(x)和其解析导数df_exact(x)。然后,使用三种方法来计算f'(x)在假设点x0的数值导数。其中,第一种方法使用了5次多项式拟合,第二种方法使用了diff函数,第三种方法使用了解析导函数。最后,将三种方法得到的导数值与解析导数值一起绘制在同一个坐标系中。
注意:为了更好地观察导数的变化,我们在x轴上选择了较宽的范围,并绘制了函数f'(x)的解析导数。您可以根据需要调整绘图范围和假设点的值。
原文地址: https://www.cveoy.top/t/topic/b4IU 著作权归作者所有。请勿转载和采集!