計算方法實驗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 μi?Mi?1?+2Mi?+λi?Mi+1?=di?,i=1,2,?,n?1

其中

μ 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?+hi?hi??

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?+hi?1?6?(hi?yi+1??yi???hi?1?yi??yi?1??)=6f(xi?1?,xi?,xi+1?)

給 定 M 0 , M n M_{0}, M_{n} M0?,Mn?的值,此時 n ? 1 n-1 n?1個方程組有 n ? 1 n-1 n?1個未知量 { 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,?,n?1}.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??λ1?2??λ2??μn?2???2μn?1??λn?2?2? ? ?M1?M2?Mn?2?Mn?1?? ?= ?d1??μ1?M0?d2??dn?2?dn?1??λn?1?Mn?? ?
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+1??x)3Mi?+(x?xi?)3Mi+1??+hi?(xi+1??x)yi?+(x?xi?)yi+1???6hi??[(xi+1??x)Mi?+(x?xi?)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.pswp.cn/web/11427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11427.shtml
英文地址,請注明出處:http://en.pswp.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…