计算方法——插值法程序实现二(牛顿法)

news2024/11/16 17:27:36

例题

给出y=e^x的函数关系表,分别利用牛顿插值法计算e^{0.27}的近似值。

x0.10.20.30.40.5
e^x1.1051711.2214031.3498591.4918251.648721

参考代码一:Python代码实现(自编码)

import math
"""
:difference_quotient差商函数
"""
def difference_quotient(x=None):
    if x is None:
        x = list()
    if len(x) < 2:
        raise ValueError('X\'s length must be bigger than 2');
    ans = 0
    for i in range(len(x)):
        temp = 1.0
        for j in range(len(x)):
            if j == i:
                continue
            temp *= (x[i]-x[j]);
        ans += (f(x[i])/temp)
    return ans
def Calculate(data_x, x):
    ans = f(data_x[0])
    print(ans)
    if len(data_x) == 1:
        return ans
    else:
        temp = 1;
        for i in range(len(data_x)-1):
            temp*=(x-data_x[i])
            ans+=difference_quotient(data_x[:i+2])*temp
        return ans
def f(x):
    return math.exp(x)
x = [0.1, 0.2, 0.3, 0.4, 0.5];
y = [1.105171,1.221403,1.349859,1.491825,1.648721];
target_point = 0.27;
fitted = Calculate(x,target_point);
real_value = f(target_point);
xx = [target_point]+x;
f_n = difference_quotient(xx);
w = []
for n in range(len(x)):
    w.append(target_point-x[n])
Remainder = f_n;
for n in range(len(x)):
    Remainder*=w[n];
print(f"点{target_point}处的真实值为{real_value}");
print(f"点{target_point}处的插值结果为{fitted}");
print(f"牛顿插值余项为{Remainder}");

Python编码计算结果

参考代码二:MATLAB代码(自编码)

%可运行代码
clc,clear
format long
x = [0.1,0.2,0.3,0.4,0.5];%可以根据题目更换
y = [1.105171,1.221403,1.349859,1.491825,1.648721];%可以根据题目更换
newpoint = 0.27;%可以根据题目更换
newtonfitted = CalculateNewTon(x,newpoint);
xx = [newpoint,x];
f_n = difference_quotient(xx(:));
w=[];
for num=1:length(xx)-1
    w = [w,newpoint-x(num)];
end
Remainder =  f_n;
for m = 1:length(x)
    Remainder = Remainder*w(m);
end
disp('点0.27处的插值结果为');
disp(newtonfitted);
disp('点0.27处的牛顿插值余项为');
disp(Remainder);
format short

difference_quotient函数

difference_quotient函数用于计算牛顿差商的函数

function result = difference_quotient(x)
if isempty(x)
    x = [];
end
if length(x)<2
    error('Error:length must be bigger than 2'); 
end
ans0 = 0;
for i = 1:length(x)
    temp = 1.0;
    for j = 1:length(x)
        if j==i
            continue
        end
        temp = temp*(x(i)-x(j));
    end
    ans0 = ans0+(exp(x(i))/temp);
end
result = ans0;

CalculateNewTon函数

CalculateNewTon函数用于计算最终插值结果

function result = CalculateNewTon(data_x,x)
ans1 = exp(data_x(1));
n = length(data_x);
if  n == 1
    result = ans1;
else
    temp = 1;
    for i = 1:length(data_x)-1
        temp = temp*(x-data_x(i));
        ans1 = ans1+difference_quotient(data_x(1:1:i+1))*temp;
    end
    result = ans1;
end

MATLAB编码结果

附C++参考代码

#include<iostream>
#include<cmath>
#include<iomanip>
const int N = 10000;
using namespace std;
double f(double x)
{
	return exp(x);
}
double difference_quotient(double x[],int count)
{
    //count用来记录传入数组的大小
	if(count<2){
		throw "X\'s length must be bigger than 2";
	}
	double ans = 0;
	for(int i=0;i<count;i++){
		double temp=1.0;
		for(int j=0;j<count;j++){
			if(j==i) continue;
			temp*=(x[i]-x[j]);
		}
		ans+=(f(x[i])/temp);
	}
	return ans;
}
double CalculateNewton(double data_x[],double x)
{
	int count=0;
	double second_data[N];
	double result = f(data_x[0]);
	double temp = 1.0;
	for(int i=0;i<4;i++)
		{
			temp*=(x-data_x[i]);
			for(int k=0;k<i+2;k++) {
			second_data[k]=data_x[k];
			count=k;
		}
			result+=difference_quotient(second_data,count+1)*temp;
		}
		return result;
}

int main()
{
	double x[] = {0.1,0.2,0.3,0.4,0.5};
	double y[] = {1.105171,1.221403,1.349859,1.491825,1.648721};
	double point = 0.27;
	double fitted = CalculateNewton(x,point);
	double real_value = f(point);
	double xx[]={0.27,0.1,0.2,0.3,0.4,0.5};
	double f_n = difference_quotient(xx,6);
	double w[N];
	for(int i=0;i<5;i++){
		w[i]=(point-x[i]);
	}
	double remainder = f_n;
	for(int i=0;i<5;i++)
	{
		remainder*=w[i];
	}
  cout<<"真实值为"<<fixed<<setprecision(15)<<real_value<<endl;
  cout<<"插值结果为"<<fixed<<setprecision(15)<<fitted<<endl;
  cout<<"拉格朗日插值余项"<<fixed<<setprecision(15)<<remainder<<endl;
	return 0;
}

C++编码执行结果

参考书目

[1] 李新栋,许文文,张绪浩,任永强. 基于Python的计算方法[M]. 北京:电子工业出版社,2023.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2104513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于AppBuilder自定义组件开发大模型应用

AppBuilder简介&#xff1a; 如果大家不了解AppBuilder的话&#xff0c;可以先到这里了解一下&#xff1a; https://cloud.baidu.com/doc/AppBuilder/s/6lq7s8lli 一句话简介&#xff1a; 千帆AppBuilder&#xff08;以下简称AppBuilder&#xff09;是基于大模型搭建AI原生应…

MySQL进阶篇2

三、SQL优化 3.1 插入数据 批量插入推荐每次在 500 ~ 1000 条数据时进行使用。如果大于1000&#xff0c;可以考虑分批次进行插入。 大批量插入数据(100万、1000万) 主键顺序插入的性能比乱序要高 3.2 主键优化 数据组织方式 页分裂 主键顺序插入 主键乱序插入 页合并 (del…

计算机网络-VRRP工作原理

一、VRRP工作原理 前面我们大概了解了VRRP的一些基础概念&#xff0c;现在开始学习VRRP的技术原理。VRRP的选举及工作步骤&#xff1a; 确定网关地址 选举主备 主设备发送VRRP报文通知Backup设备 主设备响应终端ARP并维持在Master状态 终端正常发送报文到网关进行转发 因为我们…

计算机毕业设计Hadoop+PySpark共享单车预测系统 PyHive 共享单车数据分析可视化大屏 共享单车爬虫 共享单车数据仓库 机器学习 深度学习

《Hadoop共享单车分析与预测系统》开题报告 一、课题背景与意义 1.1 课题背景 随着共享经济的快速发展&#xff0c;共享单车作为一种新型绿色环保的共享经济模式&#xff0c;在全球范围内迅速普及。共享单车通过提供便捷的短途出行服务&#xff0c;有效解决了城市居民出行的…

网络安全服务基础Windows--第9节-DNS部署与安全

域名基础知识 域名是互联⽹上⽤来识别各种实体&#xff08;如服务器、服务、⽹络&#xff09;的可读名称。它是⼀种⽅便记忆的地址&#xff0c;⽤于代替IP地址&#xff0c;因为IP地址由数字组成&#xff0c;不容易记忆。域名通过⼀种层级结构的系统组织起来&#xff0c;从最⼀ …

以人口金字塔图为例,在线绘制左右双侧堆叠条形图

导读&#xff1a; 人口金字塔&#xff08;population pyramids&#xff09;用于展示一个特定人口的年龄和性别分布。本质上是一种水平条形图。左侧是男性的数据&#xff0c;右侧是女性的数据。 Proc Natl Acad Sci U S A.文章《Demographic change and assimilation in the ea…

电脑实时监控软件分享!一分钟速览,五个好用的实时屏幕监控软件(良心推荐)

"工欲善其事&#xff0c;必先利其器。"在信息化时代&#xff0c;企业管理的高效与安全离不开先进的工具支持。 电脑实时监控软件已是现代企业管理的重要利器&#xff0c;不仅能帮助管理者实时掌握员工的工作状态&#xff0c;还能有效防止数据泄露&#xff0c;确保信…

FLV封装H265

针对FLV格式&#xff0c;目前许多开源项目和常见的视频处理工具和流媒体服务器&#xff0c;仍主要支持H.264视频编码格式&#xff0c;尚未完全兼容H.265。ffmpeg和vlc都不支持H265编码格式的FLV&#xff0c;不知道后续版本会不会支持。RTMP也是用FLV格式传输音视频&#xff0c;…

CPP继承(下)

目录 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 单继承 多继承 菱形继承 菱形继承的问题 虚继承 虚拟继承解决数据冗余和二义性的原理 继承的总结和反思 笔试面试题 继承与友元 友元关系不能继承&#xff0c;也就是说基类友元不能访问子类私有和保护…

淘宝扭蛋机小程序开发,吸引更多的消费者

随着互联网科技的快速发展&#xff0c;小程序已经成为了一个必不可少的发展趋势。小程序具有门槛低、曝光度高、方便的优势&#xff0c;能够满足消费者的需求&#xff0c;还可以为企业商家带来更多的影响力&#xff0c;因此&#xff0c;扭蛋机小程序也成为了市场发展的重要力量…

Linux网络编程:守护进程

目录 1.会话 2.守护进程的特点 3.如何将一个进程变成守护进程 1.会话 在Linux下一个会话就是 终端文件 bash&#xff0c;会话就是人类和计算机沟通的窗口和解释器。 可以在xshell中新建立一个会话验证一下。 复制会话 使用 ls /dev/pts 命令&#xff0c;查看有几个终端文…

(Lane Deteciton-1)PersFormer

介绍 在自动驾驶中&#xff0c;下游模块如规划和控制通常需要将车道位置表示为正交的鸟瞰图&#xff08;BEV&#xff09;而不是前视图表示。使用BEV表示有助于更好地与环境中的交互式代理&#xff08;如车辆、道路标志、交通灯等&#xff09;对齐任务&#xff0c;并且与其他传…

tomato靶场通关

1、使用nmap扫描C段查找网址 2、使用dirb扫描目录 3、打开网站查看目录 4、发现一个info.php文件查看 5、查看源代码&#xff0c;发现文件包含漏洞 6、查看etc/passwd &#xff0c;查看日志 7、写入一句话木马 8、使用蚁剑进行连接查看&#xff0c;可以使用终端

Vue 3 组合式 API

相比较 Vue.js 2.x 版本传统的方法组织形式&#xff0c; Vue.js 3.x 提出了组合式 API 的格式。本 章带领读者系统学习 Vue.js 3.x 新增的有关组合式 API 的知识。 本章主要涉及到如下知识。 组合式 API 与选项式 API 的语法区别。 在组合式 API 中使用生命周期…

从监控到智能:EasyCVR视频汇聚平台助力加油站安全监管升级转型

随着科技的不断进步&#xff0c;视频监控技术在各个行业的应用日益广泛&#xff0c;尤其在加油站这一关键领域&#xff0c;视频智能监管系统的应用显得尤为重要。TSINGSEE青犀视频EasyCVR视频汇聚平台作为一款基于“云-边-端”一体化架构的视频融合与AI智能分析平台&#xff0c…

guava中对Map的扩展数据结构

Multimap - 多值Map guava中的Multimap提供了将一个键映射到多个值的形式&#xff0c;使用起来无需定义复杂的内层集合&#xff0c;可以像使用普通的Map一样使用它&#xff0c;定义及放入数据如下&#xff1a; Multimap<String, Integer> multimap ArrayListMultimap.…

小琳Python课堂:Python高并发实现的基本原理(高阶版)

大家好&#xff0c;这里是小琳Python课堂&#xff01; 今天&#xff0c;我们将从高阶视角深入探讨Python高并发实现的基本原理&#xff0c;特别是线程安全性、线程同步和原子性这三个核心概念。这些概念对于构建复杂、高效的多线程应用程序至关重要。 线程安全性 首先&#x…

飞机制造5G智能工厂数字孪生工业物联平台,推进制造业数字化转型

飞机制造行业作为高端制造业的典范&#xff0c;正积极探索数字化转型的新路径。飞机制造5G智能工厂数字孪生工业物联平台&#xff08;以下简称“平台”&#xff09;的兴起&#xff0c;不仅为飞机制造业注入了强劲动力&#xff0c;更为整个制造业的数字化转型树立了新的标杆。 …

Java学习第七天

成员方法分类&#xff1a; 静态成员方法&#xff08;有static修饰 属于类&#xff09;建议用类名访问&#xff0c;也可以用对象访问 实例成员方法&#xff08;无static修饰 属于对象&#xff09;只能用对象出发访问 使用static来定义一些工具类 工具类直接使用类名.方法调用即…

Java并发线程 共享模型之管程 5

1. 生产者消费者 package cn.itcast.testcopy;import cn.itcast.n2copy.util.Sleeper; import lombok.extern.slf4j.Slf4j;import java.util.LinkedList;/*** ClassName: Test21* Package: cn.itcast.testcopy* Description: 生产者消费者** Author: 1043* Create: 2024/9/4 - …