计算方法实验7:实现三次样条插值算法

任务

point.txt文件中包含了21个压铁的位置信息

  1. 利用大M法计算出木条在压铁控制下的曲线,边界条件取自然边界条件;
  2. 将第10个压铁的位置移动至(0,10),计算出新的曲线,观察每个区间内的三次函数是否改变。

算法

μ i M i − 1 + 2 M i + λ i M i + 1 = d i , i = 1 , 2 , ⋯ , n − 1 \mu_{i}M_{i-1}+2M_{i}+\lambda_{i}M_{i+1}=d_{i},i=1,2,\cdots,n-1 μiMi1+2Mi+λiMi+1=di,i=1,2,,n1

其中

μ i = 1 − λ i \mu_{i}=1-\lambda_{i} μi=1λi

h i h i + h i \frac{h_{i}}{h_{i}+h_{i}} hi+hihi

d i = 6 h i + h i − 1 ( y i + 1 − y i h i − y i − y i − 1 h i − 1 ) = 6 f ( x i − 1 , x i , x i + 1 ) d_{i}=\frac{6}{h_{i}+h_{i-1}}\left({\frac{y_{i+1}-y_{i}}{h_{i}}-\frac{y_{i}-y_{i-1}}{h_{i-1}}}\right)=6f\left(x_{i-1},x_{i},x_{i+1}\right) di=hi+hi16(hiyi+1yihi1yiyi1)=6f(xi1,xi,xi+1)

给 定 M 0 , M n M_{0}, M_{n} M0,Mn的值,此时 n − 1 n-1 n1个方程组有 n − 1 n-1 n1个未知量 { M i , i = 1 , 2 , ⋯ , n − 1 } . 当 M 0 = 0 , M n = 0 \left\{M_i,i=1,\right.2,\cdots,n-1\}.当M_{0}=0,M_{n}=0 {Mi,i=1,2,,n1}.M0=0,Mn=0时,称为自然边界条件.
[ 2 λ 1 μ 2 2 λ 2 ⋱ ⋱ ⋱ μ n − 2 2 λ n − 2 μ n − 1 2 ] [ M 1 M 2 M n − 2 M n − 1 ] = [ d 1 − μ 1 M 0 d 2 ⋮ d n − 2 d n − 1 − λ n − 1 M n ] \begin{bmatrix}2&\lambda_{1}\\\mu_{2}&2&\lambda_{2}\\&\ddots&\ddots&\ddots\\&&\mu_{n-2}&2&\lambda_{n-2}\\&&&\mu_{n-1}&2\end{bmatrix}\begin{bmatrix}M_{1}\\M_{2}\\\\M_{n-2}\\\\M_{n-1}\end{bmatrix}=\begin{bmatrix}d_{1}-\mu_{1}M_{0}\\d_{2}\\\vdots\\d_{n-2}\\d_{n-1}-\lambda_{n-1}M_{n}\end{bmatrix} 2μ2λ12λ2μn22μn1λn22 M1M2Mn2Mn1 = d1μ1M0d2dn2dn1λn1Mn
S ( x ) = ( x i + 1 − x ) 3 M i + ( x − x i ) 3 M i + 1 6 h i + ( x i + 1 − x ) y i + ( x − x i ) y i + 1 h i − h i 6 [ ( x i + 1 − x ) M i + ( x − x i ) M i + 1 ] , x ∈ [ x i , x i + 1 ] \begin{aligned}S\left(x\right)=&\frac{\left(x_{i+1}-x\right)^{3}M_{i}+\left(x-x_{i}\right)^{3}M_{i+1}}{6h_{i}}+\frac{\left(x_{i+1}-x\right)y_{i}+\left(x-x_{i}\right)y_{i+1}}{h_{i}}\\&-\frac{h_{i}}{6}[(x_{i+1}-x)M_{i}+(x-x_{i})M_{i+1}],\quad x\in[x_{i},x_{i+1}]\end{aligned} S(x)=6hi(xi+1x)3Mi+(xxi)3Mi+1+hi(xi+1x)yi+(xxi)yi+16hi[(xi+1x)Mi+(xxi)Mi+1],x[xi,xi+1]

代码

#include<bits/stdc++.h>
using namespace std;//三次样条插值
vector<long double> Spline_Interpolation(const vector<long double>& x, const vector<long double>& y);
// 列主元消去法求解线性方程组
vector<long double> Column_Elimination(vector<vector<long double>> A, vector<long double> b);int main()
{ifstream file("point.txt");if (!file) {cerr << "Unable to open file point.txt";return 1;}vector<long double> x, y, lambda, d, h1, miu, h2;long double a, b;while (file >> a >> b){x.push_back(a);y.push_back(b);lambda.push_back(0);d.push_back(0);h1.push_back(0);h2.push_back(0);miu.push_back(0);}cout << "原始数据插值结果:" << endl;vector<long double> M1 = Spline_Interpolation(x, y);vector<vector<long double>> S1(M1.size()-1, vector<long double>(4, 0));for(int i = 0; i < M1.size(); i++){cout << "M1[" << i << "]:" << M1[i] << endl;h1[i] = x[i + 1] - x[i];}    cout << endl;for(int i = 0; i < M1.size() - 1; i++){cout << "S1[" << i << "]:";S1[i][0] = (M1[i + 1] - M1[i]) / (6 * h1[i]);cout << S1[i][0] << "x^3";S1[i][1] = (x[i + 1] * M1[i] - x[i] * M1[i + 1]) / (2 * h1[i]);if(S1[i][1] >= 0)cout << "+" ;cout << S1[i][1] << "x^2";S1[i][2] = (3 * M1[i+1] * x[i] * x[i] - 3 * M1[i] * x[i + 1] * x[i + 1] - 6 * y[i] + 6 * y[i+1] + h1[i] * h1[i] * M1[i] - h1[i] * h1[i] * M1[i + 1]) / (6 * h1[i]);if(S1[i][2] >= 0)cout << "+" ;cout << S1[i][2] << "x";S1[i][3] = (x[i + 1] * x[i + 1] * x[i + 1] * M1[i] - x[i] * x[i] * x[i] * M1[i + 1] + 6 * x[i+1] * y[i] - 6 * x[i] * y[i+1] - h1[i] * h1[i] * M1[i] * x[i+1] + h1[i] * h1[i] * M1[i+1] * x[i]) / (6 * h1[i]);if(S1[i][3] >= 0)cout << "+" ;cout << S1[i][3];cout << endl;}//修改第十个压铁的坐标为(0,10)cout << endl << "修改第十个压铁的坐标为(0,10)后:" << endl;y[9] = 10;vector<long double> M2 = Spline_Interpolation(x, y);vector<vector<long double>> S2(M2.size()-1, vector<long double>(4, 0));for(int i = 0; i < M2.size(); i++){cout << "M2[" << i << "]:" << M2[i] << endl;h2[i] = x[i + 1] - x[i];}cout << endl;for(int i = 0; i < M2.size() - 1; i++){cout << "S2[" << i << "]:";S2[i][0] = (M2[i + 1] - M2[i]) / (6 * h1[i]);cout << S2[i][0] << "x^3";S2[i][1] = (x[i + 1] * M1[i] - x[i] * M2[i + 1]) / (2 * h1[i]);if(S2[i][1] >= 0)cout << "+" ;cout << S2[i][1] << "x^2";S2[i][2] = (3 * M2[i+1] * x[i] * x[i] - 3 * M2[i] * x[i + 1] * x[i + 1] - 6 * y[i] + 6 * y[i+1] + h2[i] * h2[i] * M2[i] - h2[i] * h2[i] * M2[i + 1]) / (6 * h2[i]);if(S2[i][2] >= 0)cout << "+" ;cout << S2[i][2] << "x";S2[i][3] = (x[i + 1] * x[i + 1] * x[i + 1] * M2[i] - x[i] * x[i] * x[i] * M2[i + 1] + 6 * x[i+1] * y[i] - 6 * x[i] * y[i+1] - h2[i] * h2[i] * M2[i] * x[i+1] + h2[i] * h2[i] * M2[i+1] * x[i]) / (6 * h2[i]);if(S2[i][3] >= 0)cout << "+" ;cout << S2[i][3];cout << endl;}return 0;
}//三次样条插值
vector<long double> Spline_Interpolation(const vector<long double>& x, const vector<long double>& y) 
{int len = x.size();int n = len - 1;vector<long double> h(n), lambda(n), miu(n), d(n);for(int i = 0; i < n; i++)h[i] = x[i + 1] - x[i];for(int i = 1; i < n; i++){lambda[i] = h[i] / (h[i] + h[i - 1]);miu[i] = 1 - lambda[i];d[i] = 6 / (h[i] + h[i - 1]) * ((y[i + 1] - y[i]) / h[i] - (y[i] - y[i - 1]) / h[i - 1]);}vector<vector<long double>> A(n - 1, vector<long double>(n - 1, 0));for(int i = 0; i < n - 1; i++){A[i][i] = 2;if(i != 0)A[i][i - 1] = miu[i + 1];if(i != n - 2)A[i][i + 1] = lambda[i + 1];}vector<long double> B(n - 1, 0);for(int i = 0; i < n - 1; i++)B[i] = d[i + 1];vector<long double> M = Column_Elimination(A, B);return M;
}// 列主元消去法求解线性方程组
vector<long double> Column_Elimination(vector<vector<long double>> A, vector<long double> b)
{int n = A.size();vector<long double> x(n + 2, 0);vector<vector<long double>> matrix(n, vector<long double>(n + 1, 0));for(int i = 0; i < n; i++){matrix[i][n] = b[i];for(int j = 0; j < n; j++)matrix[i][j] = A[i][j];}for(int col = 0; col < n; col++)//找到列主元{long double maxnum = abs(matrix[col][col]);int maxrow = col;for(int row = col + 1; row < n; row++){if(abs(matrix[row][col]) > maxnum){maxnum = abs(matrix[row][col]);maxrow = row;}}swap(matrix[col], matrix[maxrow]);for(int row = col + 1; row < n; row++){long double res = matrix[row][col] / matrix[col][col];for(int loc = col; loc <= n; loc++)matrix[row][loc] -= matrix[col][loc] * res; }}for(int row = n - 1; row >= 0; row--)//回代{for(int col = row + 1; col < n; col++){matrix[row][n] -= matrix[col][n] * matrix[row][col] / matrix[col][col];matrix[row][col] = 0;}matrix[row][n] /= matrix[row][row];matrix[row][row] = 1;}for(int i = 0; i < n; i++)x[i+1] = matrix[i][n];return x;
}

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

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

相关文章

MacOS java多版本安装与管理

Home - SDKMAN! the Software Development Kit Manager # 安装sdkman curl -s "https://get.sdkman.io" | bashsource "$HOME/.sdkman/bin/sdkman-init.sh"sdk version正常出现sdkman版本号就安装成功了 # 安装java # 安装java8 sdk install java 8.0…

论文笔记:仅一个进程故障就无法达成共识

仅一个进程故障就无法达成共识 仅一个进程故障指的是在异步的分布式系统中 摘要 异步系统的共识问题&#xff08;consensus&#xff09;涉及一组进程&#xff0c;其中有的进程可能不可靠&#xff08;unreliable&#xff09;。共识问题要求可靠的进程一致地从两个侯选中决定&…

【MATLAB源码-第207期】基于matlab的单相光伏并网系统仿真,并网策略采用基于扰动观测法的MPPT模型和使用电压电流双闭环SPWM控制。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 本文将重点分析光伏发电最大功率点跟踪&#xff08;MPPT&#xff09;技术和逆变器的并网控制技术&#xff0c;并在Simulink环境下建立模拟系统&#xff0c;以体现这些技术的应用与效果。文章结构如下&#xff1a;首先简介光伏…

OpenAI下周发布更新;TikTok将自动标记AIGC;智谱AI亮相2024 ICLR

OpenAI 官宣下周举办直播发布更新 OpenAI 今日凌晨官宣&#xff0c;将在当地时间 5 月 13 日上午十点&#xff08;北京时间 5 月 14 日凌晨两点&#xff09;在官网进行直播&#xff0c;届时将演示一些 ChatGPT 和 GPT-4 的更新。 OpenAI CEO Sam Altman 补充表示&#xff0c;届…

【算法刷题day44】Leetcode:518. 零钱兑换 II、377. 组合总和 Ⅳ

文章目录 Leetcode 518. 零钱兑换 II解题思路代码总结 Leetcode 377. 组合总和 Ⅳ解题思路代码总结 草稿图网站 java的Deque Leetcode 518. 零钱兑换 II 题目&#xff1a;518. 零钱兑换 II 解析&#xff1a;代码随想录解析 解题思路 先遍历物品&#xff0c;再遍历背包。 代码…

2024软件测试面试必备面试题大全

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自江西九江&#xff0c;就读专业是电子商务&#xff0c;…

PCIE协议-2-事务层规范-MEM/IO/CFG request rules

2.2.7 内存、I/O和配置请求规则 以下规则适用于所有内存、I/O和配置请求。每种类型的请求还有特定的额外规则。 所有内存、I/O和配置请求除了常见的头标字段外&#xff0c;还包括以下字段&#xff1a;requester ID[15:0]和Tag[9:0]&#xff0c;形成事务ID。Last DW BE[3:0] a…

ICode国际青少年编程竞赛- Python-2级训练场-列表遍历

ICode国际青少年编程竞赛- Python-2级训练场-列表遍历 1、 for i in range(3):Flyer[i].step(2) Dev.step(6)2、 for i in range(7):Flyer[i].step() Dev.step(Item.x - Dev.x)3、 for i in range(3):Flyer[i].step(1) Dev.step(4) Dev.turnLeft() Dev.step(2) Dev.turnL…

【APM】在Kubernetes中搭建OpenTelemetry+Loki+Tempo+Grafana链路追踪(一)

文章目录 1、最终效果2、前提准备2、环境信息3、服务集成&#xff08;Opentelemetry ->Tempo&#xff09;3.1 上报链路数据3.1.1 下载opentelemetry-agent3.1.2 启动配置业务app3.1.3 配置opentelemetry输入输出3.1.4 配置grafana datasource3.1.4.1 配置tempo3.1.4.2 配置l…

快速判断出485从站设备是否支持MODBUS RTU无线通讯

对于变频器和仪表设备&#xff0c;都支持485串口通讯&#xff0c;那么怎么判断从站设备支持那种协议呢&#xff1f;通常分为两种方式去判断&#xff1a;1.从设备参数参看2.从设备通讯报文查看。本次文章以以台达MH300系列变频器为例。 1.从设备通讯参数查看 使用设备之前一定…

资料如何打印更省钱

在日常工作和学习中&#xff0c;我们经常需要打印各种资料。然而&#xff0c;随着打印成本的不断提高&#xff0c;如何更省钱地打印资料成为了大家关注的焦点。今天&#xff0c;就为大家分享一些资料打印的省钱技巧&#xff0c;并推荐一个省钱又省心的打印平台。 首先&#xff…

【话题】软件开发的航海图:程序员的实用神器探秘

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景一、代码编写二、版本控制三、测试与调试四、部署与运维五、总结文章推荐 背景 在软件开发的广阔海洋中&#xff0c;每一位程序员都是一位勇敢的航海家&#xff0c…

大模型日报2024-05-13

大模型日报 2024-05-13 大模型资讯 谷歌推出Gemini生成式AI平台 摘要: 生成式人工智能正在改变我们与技术的互动方式。谷歌最近推出了名为Gemini的新平台&#xff0c;该平台代表了其在生成式AI领域的最新进展。Gemini平台集成了一系列先进的工具和功能&#xff0c;旨在为用户提…

什么是图片的像素与分辨率?

什么是像素像素是组成图像的最小单元&#xff0c;把图片放大到一定程度&#xff0c;你可以看到许多小方块&#xff0c;一个方块就是一个像素&#xff0c;这些小方块都有一个明确的位置和被分配的色彩数值一个个的小方块拼合起来&#xff0c;就决定图像所呈现出来的样子。 像素…

数据结构-栈的讲解

栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底&#xff08;因为先进后出&#xff09;。栈中的数据元素遵守后进先出LIFO&#xff08;Last In Firs…

学习注意力机制并将其应用到网络中

什么是注意力机制 注意力机制的核心重点就是让网络关注到它更需要关注的地方。 当我们使用卷积神经网络去处理图片的时候&#xff0c;我们会更希望卷积神经网络去注意应该注意的地方&#xff0c;而不是什么都关注&#xff0c;我们不可能手动去调节需要注意的地方&#xff0c;…

【Pytest官方文档翻译及学习】2.1 如何调用pytest

目录 2.1 如何调用pytest 2.1.1 指定要运行的测试 2.1.2 获取有关版本、选项名称、环境变量的帮助 2.1.3 分析测试执行时间 2.1.4 管理加载插件 2.1.5 调用pytest的其他方式 2.1 如何调用pytest 2.1.1 指定要运行的测试 Pytest支持几种从命令行运行和选择测试的方法。、…

证明力引导算法forceatlas2为什么不是启发式算法

一、基本概念 吸引力 F a ( n i ) ∑ n j ∈ N c t d ( n i ) ω i , j d E ( n i , n j ) V i , j \displaystyle \bm{F}_a(n_i) \sum_{n_j \in \mathcal{N}_{ctd}(n_i)} \omega_{i,j} \; d_E(n_i,n_j) \bm{V}_{i,j} Fa​(ni​)nj​∈Nctd​(ni​)∑​ωi,j​dE​(ni​,nj​…

class常量池、运行时常量池和字符串常量池的关系

类常量池、运行时常量池和字符串常量池这三种常量池&#xff0c;在Java中扮演着不同但又相互关联的角色。理解它们之间的关系&#xff0c;有助于深入理解Java虚拟机&#xff08;JVM&#xff09;的内部工作机制&#xff0c;尤其是在类加载、内存分配和字符串处理方面。 类常量池…

MinCED:注释CRISPRs

GitHub - ctSkennerton/minced: Mining CRISPRs in Environmental Datasets 安装 git clone http://github.com/ctSkennerton/minced cd minced make 使用 gunzip -k * cat *.fa > all_MAG_contig.fasta /home/zhongpei/hard_disk_sda2/zhongpei/Software/minced/minced…