(十三)二次樣條插值


 

 1 #encoding=utf-8
 2 from numpy import *
 3 import  numpy as  np
 4 
 5 import matplotlib.pyplot as plt
 6 plt.close()
 7 fig=plt.figure()
 8 plt.grid(True)
 9 plt.xlabel("X")
10 plt.ylabel("Y")
11 plt.title(u"二次樣條", fontproperties='SimHei')
12 #二次樣條
13 #設已知n+1個點 設方程式為yi = ai*x**2+bi*x+ci,則需要求解3n個參數,則需要3n個條件。
14 # 由曲線過點得2n 個條件 ,由內點處一次求導相等得n-1個條件 ,令第一個節點處二階導為0 得一個條件 a1 = 0
15 
16 
17 # #n+1個點
18 # xi = [3,4.5,7,9]#存儲x的值
19 # n=len(xi)-1
20 # yi = [2.5,1,2.5,0.5]#存儲y 的值
21 
22 # 輸入相關數值
23 n=input("請輸入取到樣點數目:")-1
24 xi = []
25 yi = []
26 for t in range(0,n+1):
27     inputX = "請輸入第"+str(t+1)+"個點 X:"
28     inputY = "請輸入第"+str(t+1)+"個點 Y:"
29     xi.append(input(inputX))
30     yi.append(input(inputY))
31 
32 
33 
34 xi_2 = []# 存儲 x**2 的值
35 #向 x**2 中存入數據
36 for i in range(0,len(xi)):
37     xi_2.append(xi[i]**2)
38 #將方程組轉化為矩陣 使 mat1 * mat2 = mat3
39 # 可以得到行列為3n 的矩陣
40 m1 = [[0 for a in range(3*n)] for b in range(3*n)]
41 m3 = [[0 for a in range(1)] for b in range(3*n)]
42 #若 mat2 內的值定為 a1,b1 ,c1,a2,b2,c2,a3,b3,c2... 便可以確定mat1的值
43 #向 m1 中存入數據
44 #定義變量 p 用於記錄向矩陣插入的行數,及后續插入
45 p=0
46 for j in range(0,n):
47 
48 #從0 到n-1 的 n 個點代入
49     m1[p][3*j]=xi_2[j]
50     m1[p][3*j+1]=xi[j]
51     m1[p][3*j+2]=1
52     m3[p][0]=yi[j]
53     p=p+1
54 #從 1 到 n 的 n 個點代入
55     m1[p][3*j]=xi_2[j+1]
56     m1[p][3*j+1]=xi[j+1]
57     m1[p][3*j+2]=1
58     m3[p][0]=yi[j+1]
59     p=p+1
60 # 中間節點的一階導 相等 2ai + bi - 2a(i+1)-b(i+1) = 0
61 #從 1 到n-1 的 n-1 個 點處代入
62 for k in range(1,n):
63     m1[p][3*(k-1)]= 2*xi[k]
64     m1[p][3*(k-1)+1]= 1
65     m1[p][3*k]= -2*xi[k]
66     m1[p][3*k+1]= -1
67     p=p+1
68 #  代入條件 二階導為零a1 = 0
69 m1[p][0] = 2
70 p=p+1
71 #將list轉化為 矩陣
72 mat1 = np.matrix(m1)
73 mat3 = np.matrix(m3)
74 #求mat2
75 _mat1 = mat1.getI()
76 mat2=_mat1*mat3
77 # mat2=mat3/mat1
78 #將矩陣轉化為list提取數據
79 m2=mat2.tolist()
80 #整理求得的曲線
81 line=[]
82 #用於收集區間
83 interval=[]
84 for q in range(0,n):
85     interval.append(np.linspace(xi[q],xi[q+1]))
86     a=m2[q*3]
87     b=m2[q*3+1]
88     c=m2[q*3+2]
89     line.append(a*interval[q]**2+b*interval[q]+c)
90     plt.plot(interval[q],line[q])
91 plt.show()

 


免責聲明!

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



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