程序设计思路:
- 程序交互:
- 读入数据表 X,Y (以向量的形式读入)
- 读入所需要的求几次牛顿差分公式(读入n)
- 读入所需要的节点值
- 程序报错
- 如果所给数据太少,不足以求出要求的n次差分公式
- X,Y的维度不对应
- 函数主体
- 根据所给的节点值,选择合适的数据
- 求差分
- 通过牛顿前插公式求解函数值
代码:
%读入数据
while(1)
X = input('请输入所有的x:');
Y = input('请输入对应的y:');
cnt = input('请输入所要求的n次牛顿差分公式计算:');
sz_X = size(X);
sz_Y = size(Y);
if sz_X(2)~=sz_Y(2)
disp("所输入数据 X 的数量和 Y的数量不对等,无法进行计算");
disp("请重新输入数据:");
continue;
end
if cnt > size(X)
disp("所给数据太少,不支持求出对应的牛顿差分公式\n");
disp("请重新输入数据:");
continue;
end
a = input('请输入所要求的节点值:');
re = newtown(a,cnt,X,Y);
format long
fprintf('N(%f) = %f',a,re);
break;
end
function re = newtown(a,cnt,X,Y)
format long
X = sort(X);
h = X(2) - X(1);
dis = abs(X(1) - a);
i = 1;
tmp = 0;
%选择所要用的数值
while tmp < dis
tmp = abs(X(i + 1) - a);
dis = abs(X(i) - a);
i = i + 1;
if i + cnt - 1 >= size(X)
break;
end
end
i = i - 1;
new_X = X(i : i + cnt);
new_Y = Y(i : i + cnt);
disp("所选用的x值为:");
disp(new_X);
y = new_Y;
%计算差分
for i = 1:cnt + 1
fprintf("第%d阶差分如下:",i);
disp(y(i : cnt + 1));
for j = i + 1: cnt + 1
y(j) = new_Y(j) - new_Y(j - 1);
end
new_Y = y;
end
%计算t
t = (a - new_X(1)) / h;
re = 0;
%通过牛顿前插公式求值
for i = 1 : cnt + 1
temp = new_Y(i);
for j = 1 : i - 1
temp = temp * (t - j + 1);
end
temp = temp / factorial(i - 1);
re = re + temp;
end
return
end
测试:
成功测试样例1
%成功运行的测试
>> test10
请输入所有的x:[0.125 0.250 0.375 0.500 0.625 0.750]
请输入对应的y:[0.79618 0.77334 0.74371 0.70413 0.65632 0.60228]
请输入所要求的n次牛顿差分公式计算:3
请输入所要求的节点值:0.636
所选用的x值为:
0.375000000000000 0.500000000000000 0.625000000000000 0.750000000000000
第1阶差分如下: 0.743710000000000 0.704130000000000 0.656320000000000 0.602280000000000
第2阶差分如下: -0.039580000000000 -0.047810000000000 -0.054040000000000
第3阶差分如下: -0.008230000000000 -0.006230000000000
第4阶差分如下: 0.002000000000000
N(0.636000) = 0.651785
成功测试样例2
>> test10
请输入所有的x:[0.125 0.250 0.375 0.500 0.625 0.750]
请输入对应的y:[0.79618 0.77334 0.74371 0.70413 0.65632 0.60228]
请输入所要求的n次牛顿差分公式计算:3
请输入所要求的节点值:0.1581
所选用的x值为:
0.125000000000000 0.250000000000000 0.375000000000000 0.500000000000000
第1阶差分如下: 0.796180000000000 0.773340000000000 0.743710000000000 0.704130000000000
第2阶差分如下: -0.022840000000000 -0.029630000000000 -0.039580000000000
第3阶差分如下: -0.006790000000000 -0.009950000000000
第4阶差分如下: -0.003160000000000
N(0.158100) = 0.790615
查错测试
如果所给数据太少,不足以求出要求的n次差分公式
>> test10
请输入所有的x:[0.125 0.250 0.375 0.500 0.625 0.750]
请输入对应的y:[0.79618 0.77334 0.74371 0.70413 0.65632 0.60228]
请输入所要求的n次牛顿差分公式计算:7
所给数据太少,不支持求出对应的牛顿差分公式\n
请重新输入数据:
请输入所有的x:
X,Y的维度不对应
>> test10
请输入所有的x:[0.125 0.250 0.375 0.500 0.625 0.750]
请输入对应的y:[0.79618 0.77334]
请输入所要求的n次牛顿差分公式计算:3
所输入数据 X 的数量和 Y的数量不对等,无法进行计算
请重新输入数据:
请输入所有的x: