Scilab牛顿插值代码空矩阵相加警告:请求错误排查
问题排查与修复
警告原因
警告来自代码第二个for循环里的diff(y,j)调用:
- 执行
y=y(1)后,y变成了标量(单个数值) - Scilab中对单个数值调用
diff,无论阶数j是多少,都会返回空矩阵 - 后续执行
y=y+(q*s(1))/factorial(j)时,相当于标量加空矩阵,触发警告
代码错误点
- 错误覆盖原始y数组:
y=y(1)把存储原始插值节点的y数组替换成了单个标量,导致后续无法计算高阶差商 - 循环范围错误:第二个
for循环j=1:n超出了有效差商的阶数范围,n个节点最多有n-1阶差商 - 差商计算逻辑错误:反复对当前的y(已经是标量)调用
diff,完全偏离了牛顿插值的差商计算逻辑
修复后的代码
x=[1 3 5 7] y=[24 120 336 720] h=x(2)-x(1) n=length(x) disp(h) disp(n) // 预先计算各阶向前差商(牛顿向前插值用) diff_table = []; diff_table(:,1) = y'; for i=2:n diff_table(:,i) = diff(diff_table(:,i-1)); end disp("各阶向前差商表:") disp(diff_table) xi=input("value to be interpolated:") p=(xi-x(1))/h q=p // 初始化插值结果为第一个节点的y值 result = y(1) // 循环计算各阶项,最多到n-1阶 for j=1:n-1 // 取对应阶数的第一个差商(向前插值) s = diff_table(1,j+1) result = result + (q * s)/factorial(j) q = q*(p - j) end disp("the interpolated value is:", result)
修复说明
- 保留原始y数组,单独用
diff_table存储各阶差商,避免变量覆盖 - 循环范围改为
j=1:n-1,符合n个节点最多n-1阶差商的规则 - 从差商表中取对应阶数的第一个元素用于向前插值计算,彻底避免空矩阵问题
内容的提问来源于stack exchange,提问作者Shlok Jha
相关产品推荐
相关产品推荐

