根据suboff几何特征报告,运用Python求suboff模型型值点

文章目录

  • 一、艇体建模
  • 二、尾部附体建模

一、艇体建模

艇体为一轴对称的回转体,根据回转体母线方程,求得母线型值点,以x轴为回转轴,建立回转体。根据suboff几何特征报告,艇体分为Bow、Parallel middle body、Afterbody、Afterbody Cap四个部分,其方程分别为:

将其用代码表达,为:

import numpy as np
import matplotlib.pyplot as pltForebody_Length = 3.333333  # 前体长
Parallel_Middle_Body_Length = 7.3125  # 平行中体长
Afterbody_Length = 3.645833  # 后体长
Aft_Perpendicular_loc = 13.979167  # 尾柱位置
Total_Body_Length = 14.291666  # 总长
Maximum_Body_Diameter = 1.666667  # (未使用的参数)
Lambda = 24  # 缩尺比
R_max = 5 / 6  # 回转体最大半径def equation(forebody_length, parallel_middle_body_length, aft_perpendicular_loc, total_body_length):# 首部方程x_bow = np.arange(0, forebody_length, 0.01)R_bow = R_max * (1.126395101 * x_bow * (0.3 * x_bow - 1) ** 4 + 0.442874707 * x_bow ** 2 *(0.3 * x_bow - 1) ** 3 + 1 - (0.3 * x_bow - 1) ** 4 * (1.2 * x_bow + 1)) ** (1 / 2.1)plt.plot(x_bow, R_bow)# 平行中体方程x_parallel = np.arange(forebody_length, forebody_length + parallel_middle_body_length, 0.01)R_parallel = np.full(x_parallel.shape, R_max)plt.plot(x_parallel, R_parallel)# 尾部方程r_h, K_o, K_1 = 0.1175, 10, 44.6244x_afterbody = np.arange(forebody_length + parallel_middle_body_length, aft_perpendicular_loc, 0.01)eplison = (aft_perpendicular_loc - x_afterbody) / forebody_lengthR_afterbody = R_max * (r_h ** 2 + r_h * K_o * eplison ** 2 +(20 - 20 * r_h ** 2 - 4 * r_h * K_o - 1 / 3 * K_1) * eplison ** 3 +(-45 + 45 * r_h ** 2 + 6 * r_h * K_o + K_1) * eplison ** 4 +(36 - 36 * r_h ** 2 - 4 * r_h * K_o - K_1) * eplison ** 5 +(-10 + 10 * r_h ** 2 + r_h * K_o + 1 / 3 * K_1) * eplison ** 6) ** 0.5plt.plot(x_afterbody, R_afterbody)# 尾部cap方程x_afterbody_cap = np.arange(aft_perpendicular_loc, total_body_length, 0.01)R_afterbody_cap = 0.1175 * R_max * (1 - (3.2 * x_afterbody_cap - 44.733333) ** 2) ** 0.5plt.plot(x_afterbody_cap, R_afterbody_cap)plt.show()# 导出数据文件tmp_1 = np.concatenate((x_bow.reshape(-1, 1), R_bow.reshape(-1, 1)), axis=1)tmp_2 = np.concatenate((x_parallel.reshape(-1, 1), R_parallel.reshape(-1, 1)), axis=1)tmp_3 = np.concatenate((x_afterbody.reshape(-1, 1), R_afterbody.reshape(-1, 1)), axis=1)tmp_4 = np.concatenate((x_afterbody_cap.reshape(-1, 1), R_afterbody_cap.reshape(-1, 1)), axis=1)tmp = np.concatenate((tmp_1, tmp_2, tmp_3, tmp_4), axis=0)np.savetxt('艇体数据文件.txt', tmp, fmt='%.3f', delimiter=',')equation(Forebody_Length, Parallel_Middle_Body_Length, Aft_Perpendicular_loc, Total_Body_Length)

运行上述代码,生成回转体母线型值点,如下图所示。

同时,在程序运行路径下生成型值点文件,打开文件,复制所有内容,同时在autocad里点击“样条曲线拟合”命令,将上述复制的内容粘贴至autocad命令框里,生成样条曲线,保存为dwg文件,导入catia,进而根据该样条曲线建立回转体。

二、尾部附体建模

代码如下(示例):
尾部附体截面为如下所示的翼型,其中横坐标为无因次x位置。

截面方程为:

可按以下过程求解各截面型值点:
(1)先确定无因次x位置序列,在下边步骤正是求解在这些无因次x位置处的截面宽度。
(2)求尾部附体与艇体的交线(斜截面),在每个x位置处不断加减截面所处的高度,使得截面的点逐渐逼近艇体。
(3)以固定间隔求上部完整剖面,尾部附体最高位置为艇体最大半径处。
(4)根据求得的各截面,建立一个尾部附体,另外三个通过第一个旋转而来。
代码实现过程如下:

import matplotlib.pyplot as plt
import numpy as npclass SternAppendage:# 译自FORTRAN源码,变量保留了原来的名字def __init__(self):self.XXI = [0, 0.005, 0.0125, 0.025, 0.05, 0.075, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95,1.0]  # 无因次x位置self.RH = 0.1175self.AK0 = 10self.AK1 = 44.6244self.NP = 19self.RMAX = 5 / 6self.SRS = ''self.Z = ''self.ITR = ''self.RHAS = ''self.RHA = ''self.X = ''self.HH = 13.146284self.CY = ''self.XI = ''self.RBSMAX = ''self.RR = ''self.RO = ''self.DELR = ''self.eplison = ''self.spacing = ''self.spacingX = ''self.PointTmp = []self.PointTmp_neg = []self.USet = []def half_sec(self):# 求交线(斜剖面)for J in range(self.NP):self.XI = self.XXI[J]self.RR = 0.075self.DELR = 0.025self.RR += self.DELRself.ITR = 0while True:self.CY = -0.466308 * self.RR + 0.88859self.X = (self.XI - 1.0) * self.CY + self.HHeplison = (13.979167 - self.X) / 3.333333self.RHA = self.RMAX * (self.RH ** 2 + self.RH * self.AK0 * eplison ** 2 +(20 - 20 * self.RH ** 2 - 4 * self.RH * self.AK0 - 1 / 3 * self.AK1) * eplison ** 3 +(-45 + 45 * self.RH ** 2 + 6 * self.RH * self.AK0 + self.AK1) * eplison ** 4 +(36 - 36 * self.RH ** 2 - 4 * self.RH * self.AK0 - self.AK1) * eplison ** 5 +(-10 + 10 * self.RH ** 2 + self.RH * self.AK0 + 1 / 3 * self.AK1) * eplison ** 6) ** 0.5self.RHAS = self.RHA ** 2# 定义尾部附体self.Z = 0.2969 * self.XI ** 0.5 - 0.126 * self.XI - 0.3516 * self.XI ** 2 + 0.2852 * self.XI ** 3 - 0.1045 * self.XI ** 4self.Z = self.CY * self.Zself.SRS = self.RR ** 2 + self.Z ** 2# 附体在艇体表面if abs(self.SRS - self.RHAS) <= 0.00001:self.PointTmp.append(f'{self.X * 1000},{self.Z * 1000},{self.RR * 1000}')#if self.XI != 0:剖面为左右对称的,如果想将两边曲线组合为一条曲线,则不加入重复点self.PointTmp_neg.append(f'{self.X * 1000},{-self.Z * 1000},{self.RR * 1000}')if self.XI == 0:self.RBSMAX = self.RRbreakself.ITR += 1if self.ITR > 20:self.DELR *= 0.5  # 半径增量减半if self.SRS > self.RHAS:self.RR -= self.DELRif self.SRS <= self.RHAS:self.RR += self.DELRself.PointTmp.reverse()self.USet.append(self.PointTmp.copy())self.USet.append(self.PointTmp_neg.copy())self.PointTmp.clear()self.PointTmp_neg.clear()def sec(self):self.DELR = 0.05  # 半径增量for I in range(self.NP):self.RO = self.RRself.RR = self.RBSMAX + I * self.DELRif self.RR > self.RMAX:self.RR = self.RMAXif self.RR == self.RO:returnself.CY = -0.466308 * self.RR + 0.88859for J in range(self.NP):self.XI = self.XXI[J]self.X = (self.XI - 1.0) * self.CY + self.HHself.Z = 0.2969 * self.XI ** 0.5 - 0.126 * self.XI - \0.3516 * self.XI ** 2 + 0.2852 * self.XI ** 3 - 0.1045 * self.XI ** 4self.Z = self.CY * self.Zself.PointTmp.append(f'{self.X * 1000},{self.Z * 1000},{self.RR * 1000}')#if self.XI != 0:剖面为左右对称的,如果想将两边曲线组合为一条曲线,则不加入重复点self.PointTmp_neg.append(f'{self.X * 1000},{-self.Z * 1000},{self.RR * 1000}')self.PointTmp.reverse()self.USet.append(self.PointTmp.copy())self.USet.append(self.PointTmp_neg.copy())self.PointTmp.clear()self.PointTmp_neg.clear()ste = SternAppendage()
ste.half_sec()
ste.sec()
# ste.Uset里存放了各截面型值点,绘制成图像观察
fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')
for i in range(len(ste.USet)):point = []for j in range(len(ste.USet[i])):tmp = ste.USet[i][j].split(',')tmp = [float(k) for k in tmp]point.append(tmp)point = np.array(point)ax1.plot(point[:, 0], point[:, 1], point[:, 2], 'o-')
plt.show()

运行程序,得各剖面形状为:

剖面为对称的,一般仅需其一半数据,在上述代码中注释掉所有包含“self.PointTmp_neg”的语句既可。结果如下:

Uset里存放了各截面型值点,将其导出进行建模既可。

若想省去在各个软件间的来回操作,在上述代码里添加对catia的操作,直接根据点建立样条曲线。大致流程为:
(1)若对catia的COM接口不熟悉,可先在catia里录制宏,宏的内容为随便画一条样条曲线。
(2)导入操作COM接口的库,并与catia建立连接,如下:

import win32com.client
catia = win32com.client.Dispatch('CATIA.application')

(3)查看宏的代码,为VBA语言,将其复制到Python编辑环境里修改,一般来说需要修改的是,删去参数定义语句、将索引由圆括号改为方括号、将for循环等改为Python格式,VBA里的Sub类似于Python里的def。
(3)找到其中画样条曲线的命令,按照实际需要对其进行修改使用。

DARPA SUBOFF潜艇建模(一)相关推荐

  1. DARPA SUBOFF潜艇建模(二)

    Python求解围壳型值 文章目录 一.围壳方程 二.代码 一.围壳方程 二.代码 import numpy as np import matplotlib.pyplot as plt fig = p ...

  2. DARPA世界建模者(World Modelers)项目介绍

    背景 World Modelers(世界建模者计划,2017-2021年,下面简称WM)是Big Mechanisms的后续项目,与D3M.Causal Exploration是同一个项目经理(Dr. ...

  3. 【图片新闻】DARPA的新设想可能将海洋生物群体变成一个巨大的潜艇探测网络

    美国国防高级研究计划局正在研制一种海底潜艇探测系统,五角大楼的研发部门希望通过了解海底动物的行为,包括鱼.虾和微小的浮游植物,以便使用它们来探测海底行驶的载人和无人潜艇.这样的网络将增强美军探测静音潜 ...

  4. 为实现流行病预测:联邦政府在疫情暴发建模方面的努力和机遇

    翻译 | 雄狮塞拉 摘要&点评 | 耶鲁大学单博士 致谢 | 课题组33和金玉同学 _ _ _ _ 摘  要 _ _ _ _ 传染病的暴发威胁着全球健康.经济活力和美国国家安全.引发美国和国际 ...

  5. 【数字孪生】关于数字孪生的冷思考及其背后的建模和仿真技术

    来源:系统仿真学报 张霖                          北京航空航天大学教授.曾任国际建模仿真学会(SCS)主席,北 航自动化   学院副院长等,现为ASIASIM主席,中国仿真学 ...

  6. “算法战:DARPA下一代人工智能计划初见成效” 背景分析与初步研判

    2018年9月,美国国防高级研究计划局(DARPA)宣布将出资20亿美元,用于开发新的人工智能技术.近日,DARPA副局长彼得·海纳姆在华盛顿接受记者采访时说,DARPA的"下一代人工智能& ...

  7. 斯坦福大学、DARPA与硅谷公司共同分析前沿科技发展趋势

    来源:科技日报   作者:张梦然 日前,斯坦福大学研究团队.美国国防部高级研究计划局(DARPA)以及硅谷创投公司和米资本的专家们,共同研讨了技术将如何重塑行业和社会等问题.他们分析了现今全球前沿科技 ...

  8. DARPA发布产业振兴计划,继承摩尔智慧

    来源: 传感器与物联网 摘要:高登·摩尔(Gordon Moore)赖以成名的摩尔定律(Moore's law)几十年来一直引导着产业的发展,也为DARPA日前发布的"电子产业振兴计划&qu ...

  9. 统一建模语言UML轻松入门(3)――静态建模:类和对象

    统一建模语言UML轻松入门(3)――静态建模:类和对象 --------------------------------------------------------------------- 宋宝 ...

最新文章

  1. 在Windows系统利用IP地址登陆Linux服务器
  2. kafka权威指南_Kafka-分区、片段、偏移量
  3. Linux 统计多个文件中 某字符串出现的行数
  4. 搜索推荐中的召回匹配模型综述(一):传统方法
  5. hystrix隔离策略对比
  6. Scaffold php,GitHub - yiiplus/scaffold: scaffold是一个基于Yii2高级项目模版工程化实现的应用程序...
  7. 7类合作伙伴,190条沟通路径,高德汽车如何实现组织高效沟通?
  8. OpenCV 4.3 来了!功能增加,性能加速,例程更丰富~
  9. php分页类示例下载,PHP 通用分页类的简单示例
  10. jsp oracle连接池,利用Oracle自带的连接池类的一例
  11. rabbitmq接口异常函数方法_[项目更新] 集成RabbitMQ队列与EventBus总线
  12. 学计算机和电脑办公的区别,自学编程和计算机科班出身的差别在哪?
  13. c# 安装和卸载服务(window service)
  14. Java异步多线程编程探索之CompletableFuture
  15. Java使用itextpdf生成PDF文件并添加斜面水印并完成下载(图片导出pdf)
  16. 标题:书号验证 2004年起,国际ISBN中心出版了《13位国际标准书号指南》。 原有10位书号前加978作为商品分类标识;校验规则也改变。 校验位的加权算法与10位ISBN的算法不同,具体算法是
  17. 【墙角数枝梅,凌寒独自开】代码改变未来
  18. CUBEMX STM32F105RB U盘读写详细教程
  19. 角点检测的几种基本方法
  20. 如何设置搭建内网共享服务器?并实现外网访问?

热门文章

  1. Linux Ubuntu常用命令总结
  2. 深度学习-强化学习专业术语解释
  3. 下拉推广系统立择火星推荐_下拉框软件都择火星下拉下拉框软件速来火星下拉...
  4. XV6源码解读:安装与编译
  5. LabVIEW同时使用NI 的GPIB和Keysight 的HPIB控制器
  6. Python 3 内置函数 - `map()`函数
  7. Dreammail注册与登录
  8. 惠惠购物助手竟是“流氓软件”?因流量劫持被阿里告上法庭
  9. 系统死机重启调试分析
  10. raw linux是什么格式的文件怎么打开,raw文件扩展名,raw文件怎么打开?