没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
2019 年 计算方法 B 上机报告(python)
报告人:洪振鑫 班级:硕 9060
学号:3119105202 联系电话:13759915205
第一题
1.题目内容
某通信公司在一次施工中,需要在水面宽度为 50 米左右的河沟底部沿直
线走向铺设一条水底光缆。在铺设光缆之前需要对河底的地形进行初步探
测,从而估计所需光缆的长度,为工程预算提供依据。假设光缆在铺设时
可以比较紧密地贴合河床,并且已通过探测得到一组探测点位置的水的深
度数据,相邻两个探测点相距 2 米,如下表所示:(单位:米)
(1)请用合适的曲线拟合所测数据点;
(2)估算所需光缆长度的近似值,精确到小数点后两位小数,并作出铺
设河底光缆的曲线图;
2.实现思想:
从题目中可以知道,题目需要我们对河底的地形进行一定的探测,并
能够大致估算出需要的电缆长度。也就是说,我们需要通过探测出的离散
数据点,对连续的河底地形进行一个估计,然后通过这个估计出来的地形,
算出我们大致需要的线缆长度,将这个问题抽象化以后就是函数近似拟合
以及曲线积分的问题。在确定的问题的类型之后,就是要选择解决问题的
办法。高次多项式插值还是不同次数的分段插值。本题中给出了 27 个数
据点,用多项式插值的话,不可避免的会出现龙格现象,从而将给预测带
来极大的误差,这个方法实际上是没办法使用的,分段线性插值和分段 2
次插值的话,则是由于他们在数据点处不能 100%保证光滑连续,故而也
将给最终的预测带来较大的偏差故而不去选择,而这样分析之后,避免龙
格现象,光滑的衔接,自然而然的就是分段三次插值的方法。在预测线缆
的总长度的时候,我们则使用第一型曲线积分的方法,从而实现对曲线长
度的最终拟合近似。
3.算法依据
三次样条插值:
第一型曲线积分:
4.算法实现结构
读取数据->计算 h,l,u,Diag,和自然边界下的 d->
编写追赶法函数,将前面求得的参数带入求解 M(加入自然边界条件的
值)->通过三次样条的通用表达式定义函数->取插值点带入函数求值绘制
曲线->
同样基于插值点,以第一型曲线积分的概念,求出曲线的近似长度。
5.实现代码、输入输出
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import scipy.interpolate as spi
# 读入图像数据
x = np.arange(0,54,2)
y = np.array([0,4.01,6.96,7.96,7.97,8.02,9.05,10.13,11.18,12.26,13.28,12.61,
10.22,7.90,7.95,8.86,10.80,10.93,
11.23,11.30,10.94,10.10,9.54,8.30,7.30,2.50,0.20])
y = -y
# 判断 x,y 的维度是否相等,如果不等就报出指定的 data size 错误
assert x.size == y.size, "the origin data is wrong. having different size"
# in this question, we know that h == 2
# 矩阵维度计算
Dimension = x.size-2
# 由于本题的特殊性,dig=2,lamda=0.5=u,在此处就不需要考虑和原数字的 index 对位的问
题了
# 后面还是需要考虑的
h = 2
Diag = 2*np.ones(Dimension)
ld = 0.5*np.ones(Dimension-1)
u3 = 0.5*np.ones(Dimension-1)
# 通过差商求出自然边界条件下的 d 的各项值
d = np.zeros(Dimension)
for i in range(Dimension):
d[i] = 0.75*(y[i+2]-2*y[i+1]+y[i])
pass
# print(d)
# 追赶法函数
def Chasing(a,b,c,d,show=True):
# 初始化系数矩阵
l = np.zeros(a.size)
u = np.zeros(b.size)
y = np.ones(d.size)
M = np.zeros(y.size)
u[0] = b[0]
y[0] = d[0]
# 求解系数矩阵
for i in range(l.size):
l[i] = a[i]/u[i]
u[i+1] = b[i+1]-l[i]*c[i]
# 求解 ly=d
for i in range(1,y.size):
y[i] = d[i]-y[i-1]*l[i-1]
# 求解 UM=y
M[M.size-1] = y[y.size-1]/u[y.size-1]
for i in range(M.size-2,-1,-1):
M[i] = (y[i]-c[i]*M[i+1])/u[i]
# 控制参数显示
if show==True:
ShowAns(l,u,c,M)
return M
剩余19页未读,继续阅读
两斤香菜
- 粉丝: 12
- 资源: 297
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0