MATLAB中插值算法實現


 

 

 

%%%1.M文件
%(1).以往少的程序可以在命令行窗口進行編碼,但大量的程序編排到命令行窗口,
%會有造成亂碼的危險.
(2).如果將命令編成程序存儲在一個文件中(M文件),依次運行文件中的命令,
則可以重復進行
%(3).M文件根據調用方式的不同可以分為兩類:
Script:腳本文件/命令文件
Function:函數文件
M文件均以 .m為擴展名
(4).
(5).
(6).
%%%2.數據輸入:input
>>A=input('請輸入你要輸入的數字:');
請輸入你要輸入的數字:1.2 %輸入后保存到A里面
(1).A = importdata(filename)將數據從文件名所表示的文件中加載到數組 A 中


(2).num=xlsread(filename)適用於純數值型數據
%a.xlsread 是數學軟件 MATLAB 中讀取 Excel 文件中數據的一個函數
%即從當前程序所在文件夾里,按照函數中的參數指定的范圍,從單元格開始讀取文件,返回數據。
b. num = xlsread(‘filename’,‘sheet’)選擇所在的sheet,比如說’sheet1’
c.num = xlsread(‘filename’, ‘range’)所在的單元格范圍,比如說range=‘A1:A8’
(3).A=readtable(filename)通過從文件中讀取列向數據來創建表。
+++++申明: filename是文件名字 pathname是該文件地址
%%%3.網格線和坐標邊框
(1).網格線:grid on
grid off
%figure() 函數figure主要是創建圖窗窗口
figure(n)查找到n存在時,將當前窗口切換成n,不存在時創建標識為n的圖窗
(2).對數坐標圖:
semilogy(x1,y1,'參數1'…)%x軸為線性坐標刻度,y軸為常用對數刻度
%%%4.數據處理:
(1).插值問題:題目所給的數值參考(一堆數據)是按照規律每隔多少進行測量所得到的值:
那么問題來了:求那些在規律間隔內的數,並做出變化圖
%上述問題可歸結為:已知函數在某區間(域)內若干個點所處的位置,求函數在該區間其他點上的值
在x0,x1…x(n)處取值y0,y1…y(n),關於y(n)的多項式存在並且唯一(就是過這些點的方程是唯一的)
所以這個方程就是插值問題的解
%常用的插值法:Lagrange:拉格朗日多項式插值法
科學研究中,幾乎所有的問題都可以用y=f(x)的方程進行表達,但在實踐中,我們只知道一部分坐標的
數據,而根據這些數據我們能夠求出這些數據的解析式,但無法求出這些數據(x)之外的所對應的y值。
所以多項式插值應運而生。
%假設有3個不在同一直線上的點,分別為(x1,y1)、(x2,y2)、(x3,y3),求出過這3個點的曲線方程
%假設方程為:f(x)=a0+a1*x+a2*x^x
則有f1(x1)=a0+a1*x1+a2*x2^2
f2(x2)=a0+a1*x2+a2*x2^2
f3(x3)=a0+a1*x3+a2*x2^2 %確實難解三元2次方程組
拉格朗日認為可以通過三根二次曲線相加來達到目標。那這是怎么的三根二次曲線呢?
第一根曲線f1(x1),在 x1 點處取值,f1(x1)=1,f2(x2)=f3(x3)=0,因此得到過(x1,1)(x2,0)(x3,0)
的曲線,
第二根曲線f2(x2),在 x2 點處取值,f2(x2)=1,f1(x1)=f3(x3)=0,因此得到過(x1,0)(x2,1)(x3,0)
的曲線,
第三根曲線f3(x3),在 x3 點處取值,f3(x3)=1,f2(x2)=f1(x1)=0,因此得到過(x1,0)(x2,0)(x3,1)
的曲線,
往下依次……
%所以得到,y1*f1(x1)--->從坐標角度理解:那么就得到了過(x1,y1)的曲線
%y2*f2(x2)--->過(x2,y2)的曲線
%y3*f3(x3)--->過(x3,y3)的曲線
在根據拉格朗日的說法:f(x)=y1*f1(x)+y2*f2(x)+y3*f3(x)
所以得到通式:f(x)=y(i)*fi(x)
%%拉格朗日多項式插值實現流程:
1.根據初始數據x的取值求出相應的y值
2.建立m×n的矩陣
3.計算f(x)=y(i)*fi(x)(for循環)
(2).高次拉格朗日插值的Runge(龍格)現象:
Runge(龍格)的研究,證明了多項式插值的次數不超過七時成立,超過七時,插值多項式會出現嚴重的
震盪現象(稱為Runge現象)
以f(x)=1/(1+(25*x)^2)為例:
%演示龍格函數的插值情況
for i=3:2:11
x=linspace(-1,1,i);
y=1./(1+25*x.^2);
p=polyfit(x,y,i-1);
xx=-1:0.01:1;
yy=polyval(p,xx);
plot(xx,yy,'b');
hold on;
grid on;
end;
plot(x,1./(1+25*x.^2),'r');
(2).MATLAB中一維插值:
一維插值命令是interp1,格式為:y(i)=interp1(x,y,xi,'選用的插值方法是什么(Lagrange)等等');
%x,y:是我已知的坐標
%xi:是我待插值的坐標
%插值方法:'nearest'-最鄰值插值
'linear'--線性插值
'spline'--三次樣條插值
'cubic'--立方插值
二維插值命令是interp2,格式為:z(i)=interp2(x,y,z,xi,yi,'方法');


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM