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

MATLAB矩阵乘法维度错误求助:Taylor多项式代码排查

MATLAB泰勒多项式实现报错解决

我编写了一段MATLAB代码实现泰勒多项式,但运行时出现如下错误:

Error using *
Incorrect dimensions for matrix multiplication.
Error in poli3 = sin(pi*a) ...

怀疑问题出在derivadan函数的返回值上,完整代码如下:

x = -1:0.01:1; % 多项式的评估区间

y = sin(pi*x); % 原函数

a = 0; 

derivada3 = derivadan(0.01, 3, a);
derivada7 = derivadan(0.01, 7, a);

derivada3_vec = repmat(derivada3, size(x - a));
derivada7_vec = repmat(derivada7, size(x - a));


poli3 = sin(pi*a) + derivada3_vec*(x - a) + (derivada3_vec*(x - a).^2)/factorial(2) + (derivada3_vec*(x - a).^3)/factorial(3);
poli7 = sin(pi*a) + derivada7_vec*(x - a) + (derivada7_vec*(x - a).^2)/factorial(2) + (derivada7_vec*(x - a).^3)/factorial(3) + (derivada7_vec*(x - a).^4)/factorial(4) + (derivada7_vec*(x - a).^5)/factorial(5) + (derivada7_vec*(x - a).^6)/factorial(6) + (derivada7_vec*(x - a).^7)/factorial(7);


figure
plot(x, poli3, 'r', x, poli7, 'b')
legend('3阶泰勒多项式', '7阶泰勒多项式')
title('3阶与7阶泰勒多项式对比')



function Yd = derivadan(h, grado, vecX)
  Yd = zeros(size(vecX)); 
  
  for i = 1:grado
    
    Yd = (vecX(2:end) - vecX(1:end-1)) / h; 
    
    vecX = Yd;
  end
end

问题分析与修复方案

1. 维度不匹配的直接解决

报错核心是矩阵乘法*的维度不兼容:

  • derivada3_vec是201x1的列向量(x-a包含201个元素,repmat后维度一致),x-a也是201x1列向量,矩阵乘法要求左操作数的列数等于右操作数的行数,这里显然不满足。
  • 只需把所有矩阵乘法*替换为逐元素乘法.*,即可实现向量间的逐元素运算。

2. derivadan函数的逻辑错误

原函数传入标量a时,无法计算差分(差分需要至少两个点),导致返回值异常。有两种修复方式:

方式一:用解析导数(推荐,准确高效)

sin(πx)的n阶导数有解析表达式:$f^{(n)}(x) = π^n \cdot \sin\left(πx + \frac{nπ}{2}\right)$,在x=a=0处可直接计算:

x = -1:0.01:1; % 多项式评估区间
y = sin(pi*x); % 原函数
a = 0; 

% 直接计算a=0处的3阶、7阶导数
derivada3 = pi^3 * sin(3*pi/2);
derivada7 = pi^7 * sin(7*pi/2);

% 利用MATLAB广播特性,无需repmat,直接逐元素运算
poli3 = sin(pi*a) + derivada3.*(x - a) + (derivada3.*(x - a).^2)/factorial(2) + (derivada3.*(x - a).^3)/factorial(3);
poli7 = sin(pi*a) + derivada7.*(x - a) + (derivada7.*(x - a).^2)/factorial(2) + ...
    (derivada7.*(x - a).^3)/factorial(3) + (derivada7.*(x - a).^4)/factorial(4) + ...
    (derivada7.*(x - a).^5)/factorial(5) + (derivada7.*(x - a).^6)/factorial(6) + ...
    (derivada7.*(x - a).^7)/factorial(7);

figure
plot(x, y, 'g', x, poli3, 'r', x, poli7, 'b')
legend('原函数sin(πx)', '3阶泰勒多项式', '7阶泰勒多项式')
title('3阶与7阶泰勒多项式对比')
方式二:修复数值差分函数

传入包含a的多点集合,确保差分计算有足够数据:

x = -1:0.01:1; % 多项式评估区间
y = sin(pi*x); % 原函数
a = 0; 
h = 1e-5; % 缩小步长提高差分精度

% 传入a附近的点集,用于计算数值差分
x_deriv = a + (-2:1:2)*h;
y_deriv = sin(pi*x_deriv);

derivada3 = derivadan(h, 3, y_deriv);
derivada7 = derivadan(h, 7, y_deriv);

% 取中间点对应的导数(对应x=a处的导数)
derivada3 = derivada3(floor(length(derivada3)/2)+1);
derivada7 = derivada7(floor(length(derivada7)/2)+1);

% 逐元素运算构建泰勒多项式
poli3 = sin(pi*a) + derivada3.*(x - a) + (derivada3.*(x - a).^2)/factorial(2) + (derivada3.*(x - a).^3)/factorial(3);
poli7 = sin(pi*a) + derivada7.*(x - a) + (derivada7.*(x - a).^2)/factorial(2) + ...
    (derivada7.*(x - a).^3)/factorial(3) + (derivada7.*(x - a).^4)/factorial(4) + ...
    (derivada7.*(x - a).^5)/factorial(5) + (derivada7.*(x - a).^6)/factorial(6) + ...
    (derivada7.*(x - a).^7)/factorial(7);

figure
plot(x, y, 'g', x, poli3, 'r', x, poli7, 'b')
legend('原函数sin(πx)', '3阶泰勒多项式', '7阶泰勒多项式')
title('3阶与7阶泰勒多项式对比')

function Yd = derivadan(h, grado, vecY)
    Yd = vecY;
    for i = 1:grado
        % 向前差分计算导数
        Yd = (Yd(2:end) - Yd(1:end-1)) / h;
    end
end

内容的提问来源于stack exchange,提问作者DJ astro Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:16:11