欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

三次樣條插值的python3實(shí)現(xiàn)

系統(tǒng) 1885 0

最近學(xué)了高等數(shù)值分析,需要做一下數(shù)值分析相關(guān)的編程。感覺(jué)三次樣條插值和Romberg外推加速公式寫(xiě)起來(lái)還是有點(diǎn)難度的。分享一下自己的結(jié)果。

1.三次樣條插值

本來(lái)沒(méi)有什么頭緒,受一個(gè)博主的啟發(fā),學(xué)習(xí)了他的代碼稍作修改。

原博鏈接:https://blog.csdn.net/a19990412/article/details/80574057

            
              import math
import numpy as np
import matplotlib.pyplot  as plt
from sympy import *
from pylab import mpl

def func(y):
    y = np.float64(y)
    return 1/(1 + y * y)

def draw_pic(words, x, y):
    fig=plt.figure()
    plt.plot(x, y, label='interpolation')
    plt.plot(x, func(x), label='raw')
    plt.legend()
    plt.title(words, FontProperties='SimHei')
    #plt.show()
    plt.savefig(words+'.png')
    plt.close(fig)
    pass

def spline3_Parameters(x_vec):
        # parameter為二維數(shù)組,用來(lái)存放參數(shù),size_of_Interval是用來(lái)存放區(qū)間的個(gè)數(shù)
        x_new = np.array(x_vec)
        parameter = []
        size_of_Interval = len(x_new) - 1;
        i = 1
        # 首先輸入方程兩邊相鄰節(jié)點(diǎn)處函數(shù)值相等的方程為2n-2個(gè)方程
        while i < len(x_new) - 1:
            data = np.zeros(size_of_Interval * 4)
            data[(i - 1) * 4] = x_new[i] * x_new[i] * x_new[i]
            data[(i - 1) * 4 + 1] = x_new[i] * x_new[i]
            data[(i - 1) * 4 + 2] = x_new[i]
            data[(i - 1) * 4 + 3] = 1
            data1 = np.zeros(size_of_Interval * 4)
            data1[i * 4] = x_new[i] * x_new[i] * x_new[i]
            data1[i * 4 + 1] = x_new[i] * x_new[i]
            data1[i * 4 + 2] = x_new[i]
            data1[i * 4 + 3] = 1

            parameter.append(data)
            parameter.append(data1)
            i += 1
        # 輸入端點(diǎn)處的函數(shù)值。為兩個(gè)方程, 加上前面的2n - 2個(gè)方程,一共2n個(gè)方程
        data = np.zeros(size_of_Interval * 4)
        data[0] = x_new[0] * x_new[0] * x_new[0]
        data[1] = x_new[0] * x_new[0]
        data[2] = x_new[0]
        data[3] = 1
        parameter.append(data)

        data = np.zeros(size_of_Interval * 4)
        data[(size_of_Interval - 1) * 4] = x_new[-1] * x_new[-1] * x_new[-1]
        data[(size_of_Interval - 1) * 4 + 1] = x_new[-1] * x_new[-1]
        data[(size_of_Interval - 1) * 4 + 2] = x_new[-1]
        data[(size_of_Interval - 1) * 4 + 3] = 1
        parameter.append(data)
        # 端點(diǎn)函數(shù)一階導(dǎo)數(shù)值相等為n-1個(gè)方程。加上前面的方程為3n-1個(gè)方程。
        i = 1
        while i < size_of_Interval:
            data = np.zeros(size_of_Interval * 4)
            data[(i - 1) * 4] = 3 * x_new[i] * x_new[i]
            data[(i - 1) * 4 + 1] = 2 * x_new[i]
            data[(i - 1) * 4 + 2] = 1
            data[i * 4] = -3 * x_new[i] * x_new[i]
            data[i * 4 + 1] = -2 * x_new[i]
            data[i * 4 + 2] = -1
            parameter.append(data)
            i += 1
        # 端點(diǎn)函數(shù)二階導(dǎo)數(shù)值相等為n-1個(gè)方程。加上前面的方程為4n-2個(gè)方程。
        i = 1
        while i < len(x_new) - 1:
            data = np.zeros(size_of_Interval * 4)
            data[(i - 1) * 4] = 6 * x_new[i]
            data[(i - 1) * 4 + 1] = 2
            data[i * 4] = -6 * x_new[i]
            data[i * 4 + 1] = -2
            parameter.append(data)
            i += 1
        #端點(diǎn)處的函數(shù)值的二階導(dǎo)數(shù)為原函數(shù)的二階導(dǎo)數(shù),為兩個(gè)方程。總共為4n個(gè)方程。
        data = np.zeros(size_of_Interval * 4)
        data[0] = 6 * x_new[0]
        data[1] = 2
        parameter.append(data)
        data = np.zeros(size_of_Interval * 4)
        data[-4] = 6 * x_new[-1]
        data[-3] = 2
        parameter.append(data)
        #df = pd.DataFrame(parameter)
        #df.to_csv('para.csv')
        return parameter


    # 功能:計(jì)算樣條函數(shù)的系數(shù)。
    # 參數(shù):parametes為方程的系數(shù),y為要插值函數(shù)的因變量。
    # 返回值:三次插值函數(shù)的系數(shù)。

def solution_of_equation(parametes, x):
        size_of_Interval = len(x) - 1;
        result = np.zeros(size_of_Interval * 4)
        i = 1
        while i < size_of_Interval:
            result[(i - 1) * 2] = func(x[i])
            result[(i - 1) * 2 + 1] = func(x[i])
            i += 1
        result[(size_of_Interval - 1) * 2] = func(x[0])
        result[(size_of_Interval - 1) * 2 + 1] = func(x[-1])
        result[-2] = 5/13
        result[-1] = -5 / 13
        a = np.array(spline3_Parameters(x))
        b = np.array(result)
        #print(b)
        return np.linalg.solve(a, b)


    # 功能:根據(jù)所給參數(shù),計(jì)算三次函數(shù)的函數(shù)值:
    # 參數(shù):parameters為二次函數(shù)的系數(shù),x為自變量
    # 返回值:為函數(shù)的因變量
def calculate(paremeters, x):
        result = []
        for data_x in x:
            result.append(
                paremeters[0] * data_x * data_x * data_x + paremeters[1] * data_x * data_x + paremeters[2] * data_x +
                paremeters[3])
        return result

x_init4 = np.arange(-5, 5.1, 1 )
result = solution_of_equation(spline3_Parameters(x_init4), x_init4)
#print(spline3_Parameters(x_init4))
#print(result)
x_axis4 = []
y_axis4 = []
for i in range(10):
    temp = np.arange(-5 + i, -4 + i, 0.01)
    x_axis4 = np.append(x_axis4, temp)
    y_axis4 = np.append(y_axis4, calculate(
        [result[4 * i], result[1 + 4 * i], result[2 + 4 * i], result[3 + 4 * i]], temp))
draw_pic('三次樣條插值與原函數(shù)的對(duì)比圖', x_axis4, y_axis4)

            
          

原博的代碼針對(duì)邊界的二次導(dǎo)數(shù)為0,故原博使用的矩陣刪去了兩位。不太具有普遍意義,故做了修改。

代碼運(yùn)行結(jié)果

三次樣條插值的python3實(shí)現(xiàn)_第1張圖片

2.Romberg求積分,外推加速公式

            
              import numpy as np

# 編寫(xiě)Romberg求積法,并計(jì)算
def romberg(inf, sup, lenth): #定義函數(shù)的輸入,積分上下界,分塊的數(shù)量
    vec_init = np.zeros(lenth + 1)
    vec_init[0] = 0.5 * (func(sup) + func(inf)) / (sup - inf)
    #初始化T0向量,計(jì)算并賦值
    for i in range(1, lenth):
        vec_init[i] = 0.5 * vec_init[i - 1] + np.array(
            [func(inf + (sup - inf) * (2 * j + 1)/(2 ** i))
             for j in range(2 ** (i - 1) - 1)], dtype=np.float64).sum() * (sup - inf) / 2 ** i
    count = lenth
    deepth = 1
    #設(shè)置停止條件,前后兩次迭代結(jié)果之差小于10^-10
    while np.abs(vec_init[count] - vec_init[count - 1]) > 10 ** -10:
        print('現(xiàn)在在第', deepth, '層')
        vec_init[0: count - 1] = np.array([(4 ** deepth * vec_init[k + 1] - vec_init[k]) / (4 ** deepth - 1)
                                          for k in range(count - 1)], dtype=np.float64)
        deepth += 1
        count -= 1
    return vec_init[count]

def func(x):
    return (np.log(1 + x)) / (1 + x ** 2)

print('計(jì)算結(jié)果為', romberg(0, 1, 20))

#計(jì)算結(jié)果為 0.27219012135491993
            
          

?編寫(xiě)思路:使用一個(gè)向量?jī)?chǔ)存逐次迭代的結(jié)果,比較倒數(shù)1、2位的結(jié)果之差設(shè)為精度條件


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 成人毛片免费网站 | 久一在线视频 | 一级做a爰片久久毛片人呢 达达兔午夜起神影院在线观看麻烦 | 九九re6精品视频在线观看 | 久久久一区二区三区精品 | 久久久无码精品成人A片小说 | 国产精品免费大片一区二区 | 欧美1区 | 国产高清视频在线 | 少妇特黄A片一区二区三区免费看 | 成年免费视频网站入口 | 亚洲日本高清成人aⅴ片 | 99成人 | 成人免费在线视频观看 | 国产精品欧美一区二区三区 | 亚洲夜夜爽 | 国产成人精品福利网站在线观看 | 国产一区二区黑人欧美xxxx | 欧美乱码精品一区 | 1级毛片| 日韩精品一区二区三区不卡 | 国产精品亚洲综合色拍 | 日韩成人在线电影 | 国产三级在线观看视频 | 亚洲欧洲精品成人久久奇米网 | 伊人久久电影网 | 日韩三及片| 嫩草影院国产 | 一级毛片视频免费 | 日朝欧美亚洲精品 | 性欧美激情在线观看 | 91网站免费观看 | 99草视频| 国产高清在线精品一区αpp | 亚洲国产中文字幕 | 夜夜操夜夜骑 | 久碰香蕉精品视频在线观看 | 欧美激情视频一区二区免费 | 狠狠色噜噜狠狠狠狠色吗综合 | 欧美成人手机视频 | 99国产精品视频免费观看 |