Python学习手札04——Newton插值计算问题

Newton插值计算

说明:该博的目标是求单点插值

计算步骤

1、按照需求定插值函数的阶数;
2、根据阶数选取阶数+1个已知数作为计算需要的数;
3、按照如下公式计算差商,最好列出差商表,方便计算;
差商计算公式差商表
4、然后将差商带入如下多项式,得出插值多项式;
Newton插值多项式
5、最后带值计算出插值结果

代码示例

# -*- coding: utf-8 -*-
"""
Created on Fri Oct 11 12:52:34 2019

@author: ZHIFU
"""

import xlrd
def Newton(number, n):
    # number为x的值,n 的值为阶数+1
    # cols_1 = []
    # cols_2 = []
    workbook = xlrd.open_workbook(r"C:\Users\ZHIFU\Desktop\shuzhifenxi.xlsx")
    print(workbook)
    sheet_name =workbook.sheet_names()[0] #  获取sheet表格的名称
    sheet = workbook.sheet_by_index(0) #  根据sheet索引或者名称获取sheet内容
    print(sheet.name, sheet.nrows, sheet.ncols) #  打印名称及行列
    sheet_rows = sheet.nrows
    print("已知参数的个数:%d"% sheet_rows)
    cols_1 = sheet.col_values(0) #  获取第1列数据
    cols_2 = sheet.col_values(1) #  获取第2列数据
    print("已知参数自变量的值:%s"% cols_1)
    print("已知参数应变量的值:%s"% cols_2)
    print("从excle中选取的表格:%s"% sheet_name)
    freelist_1 = [] #  number与已知自变量差值的绝对值
    for i in range(0, sheet_rows):
        freelist_1.append(abs(cols_1[i] - number))
        
    # print("计算值与自变量的差的绝对值:%s"% freelist_1)
    freelist_1.sort()   
    freelist_1_len = len(freelist_1)
    print("freelist_1中元素的个数:%d"% freelist_1_len)
    freelist_index_1 = []  #  寻找最接近计算值的自变量在原列表(cols_1)中的索引值
    for i in range(0, n):
        for j in range(0, sheet_rows):
            if abs(cols_1[j] - number) == freelist_1[i]:
                freelist_index_1.append(j)
                freelist_index_2 = []
                for k in freelist_index_1:
                    if not k in freelist_index_2:
                        freelist_index_2.append(k)
        i += 1
    print("最接近计算值的自变量的索引:%s"% freelist_index_2)
    freelist_index_2.sort()
    freelist_x_value = [] 
    freelist_y_value = [] 
    for i in range(0, n):
        j = freelist_index_2[i]
        freelist_x_value.append(cols_1[j])
        freelist_y_value.append(cols_2[j])
    count = len(freelist_x_value)
    print("最接近计算值的自变量:%s"% freelist_x_value)
    print("最接近计算值的自变量对应的应变量:%s"% freelist_y_value)
    freelist_f = [] # 每一阶差商的第一个差商按阶增加的顺序添加到列表中
    fist_x_y = freelist_y_value[0] # 第一个x对应的f(x)
    m = 0
    while m <= count:
        f1_list = []
        if len(freelist_y_value) == 1:
            break
        for j in range(0, count-m-1):
            for k in range(j+1, j+2):
                for i in range(j+m+1, j+m+2):
                    f1= ((freelist_y_value[k] - freelist_y_value[j])
                        /(freelist_x_value[i] - freelist_x_value[j]))
                    f1_list.append(f1)
        freelist_y_value = f1_list # 使每次得到的差商进入循环
        # print(freelist_y_value)
        freelist_f.append(freelist_y_value[0])
        m += 1
    freelist_f.insert(0, fist_x_y) # 在列表中插入0阶差商
    print("freelist_f的值为%s"% freelist_f) # 列表中除第一个元素为第一个x对应的f(x)外,其余均为差商
    r = 1
    r_list = [r,] # 0阶差商的系数为1
    for i in range(0, len(freelist_f)-1):
        r *= number - freelist_x_value[i]
        r_list.append(r)
    print("r_list对应的值为%s"% r_list) # 列表中除1以外,其余均为x - xi的乘积
    re = 0
    for i in range(0, len(freelist_f)):
        re += freelist_f[i] * r_list[i]
    print("%.2f 的 %d 阶插值结果为 %.4f "% (number, n-1, re))
Newton(0.285, 3)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值