news 2026/5/25 18:22:55

牛顿插值(测试)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
牛顿插值(测试)

N(x) = f[x0] + f[x0,x1](x-x0) + f[x0,x1,x2](x-x0)(x-x1) + ... + f[x0,...,xn](x-x0)...(x-x_{n-1})

其中f[x0,...,xk]是 k 阶差商。

差商表可视化示例:

假设:对于点 (1,1), (2,4), (3,9),(4,16)

差商表:
索引 x y=f(x) 一阶差商 二阶差商 三阶差商 0 1 1 1 2 4 2 3 9 3 4 16
一级商差:
f[x₀, x₁] = (f(x₁) - f(x₀)) / (x₁ - x₀) = (4 - 1) / (2 - 1) = 3/1 = 3 f[x₁, x₂] = (9 - 4) / (3 - 2) = 5/1 = 5 f[x₂, x₃] = (16 - 9) / (4 - 3) = 7/1 = 7 更新表: 索引 x y 一阶差商 二阶差商 三阶差商 0 1 1 3 1 2 4 5 2 3 9 7 3 4 16

二级商差:

f[x₀, x₁, x₂] = (f[x₁, x₂] - f[x₀, x₁]) / (x₂ - x₀) = (5 - 3) / (3 - 1) = 2/2 = 1 f[x₁, x₂, x₃] = (f[x₂, x₃] - f[x₁, x₂]) / (x₃ - x₁) = (7 - 5) / (4 - 2) = 2/2 = 1 更新表: 索引 x y 一阶差商 二阶差商 三阶差商 0 1 1 3 1 2 4 1 5 2 3 9 1 7 3 4 16

三级商差:

f[x₀, x₁, x₂, x₃] = (f[x₁, x₂, x₃] - f[x₀, x₁, x₂]) / (x₃ - x₀) = (1 - 1) / (4 - 1) = 0/3 = 0 更新完整表: 索引 x y 一阶差商 二阶差商 三阶差商 0 1 1 3 1 2 4 1 5 0 2 3 9 1 7 3 4 16

差商表的完整形式

按对角线提取差商系数:

差商系数(取自第一行): a₀ = f[x₀] = 1 a₁ = f[x₀, x₁] = 3 a₂ = f[x₀, x₁, x₂] = 1 a₃ = f[x₀, x₁, x₂, x₃] = 0

牛顿插值多项式:

N(x) = a₀ + a₁(x-x₀) + a₂(x-x₀)(x-x₁) + a₃(x-x₀)(x-x₁)(x-x₂) = 1 + 3(x-1) + 1·(x-1)(x-2) + 0·(x-1)(x-2)(x-3) = 1 + 3x - 3 + (x² - 3x + 2) = x²

性质3:多项式的差商

对于n次多项式:

  • 0到n阶差商非零

  • n+1阶及更高阶差商为0

本例中 f(x)=x² 是二次多项式,所以三阶差商为0。

核心思想:差商将连续函数的导数概念推广到离散数据点,使我们能用多项式拟合任意离散数据。牛顿插值的优势在于:增加新数据点时,只需计算新的差商,不需要重新计算所有系数。

java编程测试:

package testHtt; public class NiuDun { public static void main(String[] args) { // 测试数据点 double[] x = {1.0, 2.0, 3.0, 4.0}; double[] y = {1.0, 4.0, 9.0, 16.0}; // f(x) = x^2 double targetX = 2.5; double result = newtonInterpolate(x, y, targetX); System.out.printf("在 x = %.2f 处的插值结果为: %.6f\n", targetX, result); System.out.printf("实际值应为: %.2f\n", 2.5 * 2.5); } /** * 计算牛顿插值 * @param x 已知点的x坐标数组 * @param y 已知点的y坐标数组 * @param targetX 需要插值的x坐标 * @return 插值结果 */ public static double newtonInterpolate(double[] x, double[] y, double targetX) { int n = x.length; double[][] dividedDifferences = new double[n][n]; // 初始化0阶差商(即函数值) for (int i = 0; i < n; i++) { dividedDifferences[i][0] = y[i]; } // 计算各阶差商 for (int j = 1; j < n; j++) { for (int i = 0; i < n - j; i++) { dividedDifferences[i][j] = (dividedDifferences[i + 1][j - 1] - dividedDifferences[i][j - 1]) / (x[i + j] - x[i]); } } // 计算插值结果 double result = dividedDifferences[0][0]; // f[x0] double product = 1.0; for (int i = 1; i < n; i++) { product *= (targetX - x[i - 1]); result += dividedDifferences[0][i] * product; } return result; } }

递归计算差商

public class RecursiveNewtonInterpolation { /** * 递归计算k阶差商 */ public static double dividedDifference(double[] x, double[] y, int i, int j) { if (i == j) { return y[i]; } return (dividedDifference(x, y, i + 1, j) - dividedDifference(x, y, i, j - 1)) / (x[j] - x[i]); } /** * 使用递归差商计算插值 */ public static double interpolate(double[] x, double[] y, double targetX) { int n = x.length; double result = y[0]; double product = 1.0; for (int i = 1; i < n; i++) { product *= (targetX - x[i - 1]); // 递归计算i阶差商 result += dividedDifference(x, y, 0, i) * product; } return result; } public static void main(String[] args) { double[] x = {0, 1, 2, 3}; double[] y = {1, 2, 4, 8}; // 近似指数 System.out.println("差商表:"); for (int i = 0; i < x.length; i++) { for (int j = i; j < x.length; j++) { double dd = dividedDifference(x, y, i, j); System.out.printf("f[x%d,...,x%d] = %.6f\t", i, j, dd); } System.out.println(); } double testX = 1.5; double result = interpolate(x, y, testX); System.out.printf("\n在 x = %.2f 处的插值结果: %.6f\n", testX, result); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 20:43:08

【计算机毕业设计案例】基于Java Web的银饰饰品商城系统的设计与实现基于springboot的饰品商城系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/22 6:20:15

day165—递归—最长回文子序列(LeetCode-516)

题目描述给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。示例 1&#xff1a;输入&#xff1a;s "bbbab" …

作者头像 李华
网站建设 2026/5/20 22:13:02

【课程设计/毕业设计】基于springboot的企业日报管理日报管理系统设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/22 8:50:21

回文排列 II:别再傻傻地全排列了,剪枝才是王道

回文排列 II:别再傻傻地全排列了,剪枝才是王道 大家好,我是 Echo_Wish。 今天咱们聊一道看起来是“字符串 + 回溯”的老题,但一不小心就会把 CPU 跑冒烟的经典问题—— 回文排列 II(Palindrome Permutation II)。 这道题我特别喜欢,因为它非常适合用来区分“会写代码”…

作者头像 李华
网站建设 2026/5/20 11:49:31

【2026年-03期】Collaborative evolution between AI and humans

这是一幅关于 AI 与人类协作进化的逻辑全景图&#xff0c;它梳理了从 AI 技术迭代到人类能力重塑&#xff0c;再到二者形成新协作模式的完整逻辑链条。AI 演进与人类能力的底层逻辑AI 演进的双轮驱动AI 演化速度&#xff1a;从 GPT-3 → GPT-4 → GPT-5&#xff0c;模型能力不断…

作者头像 李华