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

