数值分析实验报告:拉格朗日插值法和牛顿插值法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一报告
拉格朗日插值法
一、实验目的
1、学习和掌握拉格朗日插值多项式
2、运用拉格朗日插值多项式进行计算
二、实验原理
根据x0,x1,…xn;y0,y1,…yn构造插值多项式其表达式为:
将插值点x代入上式,就可得到函数f(x)在点x处的函数值的近似值。
三、运行结果
四、代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static double lglr(double[] x, double[] y, double x1, int n) {
double result = 0.0;
for (int i = 0; i { double temp = y[i]; for (int j = 0; j < n; j++) { if (j == i) continue; temp = temp * (x1 - x[j]); temp = temp / (x[i] - x[j]); } result = result + temp; } return result; } static void Main(string[] args) { double[] x; double[] y; Console.WriteLine("请输入插值点数:"); int length = Convert.ToInt32(Console.ReadLine()); x = new double[length]; y = new double[length]; for (int i = 0; i < length; i++) { Console.Write("请输入第{0}个点的x值:", i + 1); x[i] = Convert.ToDouble(Console.ReadLine()); Console.Write("请输入第{0}个点的y值:", i + 1); y[i] = Convert.ToDouble(Console.ReadLine()); } Console.WriteLine("请输入x1值:"); double x1 = Convert.ToDouble(Console.ReadLine()); double result=lglr(x,y,x1,length); Console.Write("插值计算结果为:{0}:", result); Console.ReadLine(); } 牛顿插值法 一、实验目的 体会并了解牛顿插值法,用计算机插入x值,输出相应的y值。 二、实验原理 根据x0,x1,…x n;y0,y1,…y n构造插值多项式Nn(x)=f(x0)+f(x0,x1)(x-x0)+… +f(x0,x1,…xn)(x-x0)(x-x1)…(x-xn-1)牛顿差值公式中各项的系数就是函f(x)的各阶均差(差商)f(x0),f(x0,x1),f(x0,x1,…xn),因此,在构造牛顿差值公式时,常常先把均差列成一个表,此表称为均差表。 三、运行结果 四、代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace newton { class Program { static double chashang(int n, double[] x, double[] y) { double f = 0; double temp = 0; for (int i = 0; i < n + 1; i++) { temp = y[i]; for (int j = 0; j < n + 1; j++) if (i != j) temp /= (x[i] - x[j]); f += temp; } return f; } static double niudun(double[] x, double[] y, double x1) { double result = 0.0; for (int i = 0; i < x.Length; i++) { double f = chashang(i, x, y); double temp = 1.0; for (int j = 0; j < i; j++) { temp = temp * (x1 - x[j]); } result = result + f * temp; } return result; } static void Main(string[] args) { double[] x; double[] y; Console.WriteLine("请输入插值点数:"); int length = Convert.ToInt32(Console.ReadLine()); x = new double[length]; y = new double[length]; for (int i = 0; i < length; i++) { Console.Write("请输入第{0}个点的x值:", i + 1); x[i] = Convert.ToDouble(Console.ReadLine()); Console.Write("请输入第{0}个点的y值:", i + 1); y[i] = Convert.ToDouble(Console.ReadLine()); } Console.WriteLine("请输入x1值:"); double x1 = Convert.ToDouble(Console.ReadLine()); double result = niudun(x, y, x1); Console.Write("插值计算结果为:{0}:", result); Console.ReadLine(); } } } 五、分析 当插值多项式从n-1次增加到n次时,拉格朗日型插值必须重新计算所有的基本差值多项式;二对于牛顿插值,只需要表格再计算一个n阶均差,然后加上一项就可以了。这样大大减少了计算量,特别在计算结构复杂的多项式的时候,当然本实验中的数据组很少,计算机的计算速度快慢不明显而难以比较两种方法的优劣。