鱼C论坛

 找回密码
 立即注册
查看: 1687|回复: 2

关于三次样条计算溢出问题,球球各位老哥们帮帮忙啦,万分感谢!!!

[复制链接]
发表于 2021-1-28 11:43:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
C:/Users/dell/PycharmProjects/pythonProject1/main.py:38: RuntimeWarning: overflow encountered in long_scalars
  data[(i - 1) * 4] = x[i] * x[i] * x[i]
C:/Users/dell/PycharmProjects/pythonProject1/main.py:44: RuntimeWarning: overflow encountered in long_scalars
  data1[i * 4] = x[i] * x[i] * x[i]
C:/Users/dell/PycharmProjects/pythonProject1/main.py:61: RuntimeWarning: overflow encountered in long_scalars
  data[(sizeOfInterval - 1) * 4 + 0] = x[-1] * x[-1] * x[-1]

Process finished with exit code 0

各位大哥,上面这个错误该怎么改啊,救救孩子吧,不知道怎么增加整数个数。

下面是代码

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from pylab import mpl
  4. from openpyxl import load_workbook
  5. # 导入 excel 表格中的数据
  6. wb = load_workbook(filename='sea2020.xlsx')
  7. sheet_ranges = wb['sea2020']

  8. def find():
  9.     for i in range(2, 53):
  10.         x.append(sheet_ranges['A%s' % i].value)
  11.         y.append(sheet_ranges['B%s' % i].value)
  12. x = []
  13. y = []
  14. find()
  15. x = np.array(x)
  16. y = np.array(y)
  17. # print(x)

  18. def init(size):
  19.     j = 0
  20.     data = []
  21.     while j < size:
  22.         data.append(0)
  23.         j += 1
  24.     return data

  25. def calculateEquationParameters(x):
  26.     # parameter为二维数组,用来存放参数,sizeOfInterval是用来存放区间的个数
  27.     parameter = []
  28.     sizeOfInterval = len(x) - 1
  29.     # print(sizeOfInterval) = 50  正确
  30.     i = 1
  31.     # 首先输入方程两边相邻节点处函数值相等的方程为2n-2个方程
  32.     while i < len(x)-1:
  33.         data = init(sizeOfInterval * 4)
  34.         data[(i - 1) * 4] = x[i] * x[i] * x[i]
  35.         data[(i - 1) * 4 + 1] = x[i] * x[i]
  36.         data[(i - 1) * 4 + 2] = x[i]
  37.         data[(i - 1) * 4 + 3] = 1
  38.         # print(data)    一共有49行,49个方程
  39.         data1 = init(sizeOfInterval * 4)
  40.         data1[i * 4] = x[i] * x[i] * x[i]
  41.         data1[i * 4 + 1] = x[i] * x[i]
  42.         data1[i * 4 + 2] = x[i]
  43.         data1[i * 4 + 3] = 1
  44.         # print(data1)   一共有49行,49个方程
  45.         temp = data[2:]
  46.         # print(len(temp))
  47.         parameter.append(temp)
  48.         temp = data1[2:]
  49.         parameter.append(temp)
  50.         i += 1
  51.     # 输入端点处的函数值。为两个方程,加上前面的2n-2个方程,一共2n个方程
  52.     data = init(sizeOfInterval*4-2)
  53.     data[0] = x[0]
  54.     data[1] = 1
  55.     parameter.append(data)
  56.     data = init(sizeOfInterval * 4)
  57.     data[(sizeOfInterval - 1) * 4 + 0] = x[-1] * x[-1] * x[-1]
  58.     data[(sizeOfInterval - 1) * 4 + 1] = x[-1] * x[-1]
  59.     data[(sizeOfInterval - 1) * 4 + 2] = x[-1]
  60.     data[(sizeOfInterval - 1) * 4 + 3] = 1
  61.     temp = data[2:]
  62.     parameter.append(temp)
  63.     # 端点一阶导数值相等为n-1个方程,就是将参数全部移到等式一端,另一端为零。加上前面的方程为3n-1个方程
  64.     i = 1
  65.     while i < len(x) - 1:
  66.         data = init(sizeOfInterval * 4)
  67.         data[(i - 1) * 4] = 3 * x[i] * x[i]
  68.         data[(i - 1) * 4 + 1] = 2 * x[i]
  69.         data[(i - 1) * 4 + 2] = 1
  70.         data[i * 4] = -3 * x[i] * x[i]
  71.         data[i * 4 + 1] = -2 * x[i]
  72.         data[i * 4 + 2] = -1
  73.         # print(data)    一共49个方程
  74.         temp = data[2:]
  75.         parameter.append(temp)
  76.         i += 1
  77.     # 端点二阶导数相等为n-1个方程,全部移到等式一端,另一端为0,一共为4n-2个方程。
  78.     i = 1
  79.     while i < len(x) - 1:
  80.         data = init(sizeOfInterval * 4)
  81.         data[(i - 1) * 4] = 6 * x[i]
  82.         data[(i - 1) * 4 + 1] = 2
  83.         data[i * 4] = -6 * x[i]
  84.         data[i * 4 + 1] = -2
  85.         # print(data)    一共49个方程
  86.         temp = data[2:]
  87.         parameter.append(temp)
  88.         i += 1
  89.     # print(parameter)
  90.     return parameter

  91. # 计算出各方程参数的值
  92. def solutionOfEquation(parametes,y):
  93.     sizeOfInterval = len(x) - 1
  94.     result = init(sizeOfInterval * 4 - 2)
  95.     i = 1
  96.     while i < sizeOfInterval:
  97.         result[(i - 1) * 2] = y[i]
  98.         result[(i - 1) * 2 + 1] = y[i]
  99.         i += 1
  100.     result[(sizeOfInterval - 1) * 2] = y[0]
  101.     result[(sizeOfInterval - 1) * 2 + 1] = y[-1]
  102.     # print(len(result))       列向量,198行
  103.     a = np.array(calculateEquationParameters(x),dtype='int64')
  104.     # print(len(a))
  105.     b = np.array(result,dtype='int64')
  106.     # print(b)
  107.     return np.linalg.solve(a, b)

  108. def calculate(paremeters,x):
  109.     result = []
  110.     for data_x in x:
  111.         result.append(paremeters[0] * data_x * data_x * data_x+ paremeters[1] * data_x * data_x + paremeters[2] * data_x + paremeters[3])
  112.     return result

  113. def Draw(data_x,data_y,new_data_x,new_data_y):
  114.     plt.plot(new_data_x, new_data_y, label=u"拟合曲线", color="black")
  115.     plt.scatter(data_x, data_y, label=u"离散数据", color="red")
  116.     mpl.rcParams['font.sans-serif'] = ['SimHei']  # 使图形中的中文正常编码显示
  117.     mpl.rcParams['axes.unicode_minus'] = False  # 使坐标轴刻度表签正常显示正负号
  118.     plt.title(u"三次样条函数")
  119.     plt.legend(loc="best")
  120.     plt.show()

  121. result = solutionOfEquation(calculateEquationParameters(x),y)
  122. new_data_x = []
  123. new_data_y = []
  124. for i in range(0, 50):
  125.     new_data_x1 = []
  126.     new_data_x1 = np.arange(i * 100, (i + 1) * 100, 1)
  127.     if i == 0:
  128.         new_data_y1 = calculate([0 , 0 , result[0] , result[1]] , new_data_x1)
  129.     else:
  130.         new_data_y1 = calculate([result[2 + (i - 1) * 4] , result[3 + (i - 1) * 4] , result[4 + (i - 1) * 4] , result[5 + (i - 1) * 4]] , new_data_x1)
  131.     new_data_x.extend(new_data_x1)
  132.     new_data_y.extend(new_data_y1)
  133. Draw(x, y, new_data_x, new_data_y)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-1-29 12:18:32 | 显示全部楼层
球球各位大哥帮帮忙
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-29 12:20:50 | 显示全部楼层
这是excel数据,

sea2020.zip

8.19 KB, 下载次数: 0

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-28 15:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表