python电化学cv曲线怎么画_我如何使用参数自动绘制翼型

引言

在用遗传算法优化翼型之前,我们需要建立一个足够大的翼型种群库。这时候就需要我们参数化绘制翼型,自动生成第一批种子。

翼型的构成

首先,我们得知道翼型是怎么构成的。常用翼型测算工具的都知道,单弯度翼型有四个重要的参数,那就是相对厚度及其位置,最大弯度及其位置。

比如用xfoil导入一个翼型后,输入GDES,TSET命令就可以看到一个翼型被分解成两条曲线后的状态。(厚度曲线是对称的)

这四个参数能决定一个翼型的大致样貌,但是不能完全决定一个翼型。也就是用不同的方法生成一个翼型,即使参数相同,翼型也会有所不同。而形状上一点点的不同,会对气动有着蝴蝶效应般的影响。

如下两个翼型,一个是大名鼎鼎的MH 114,一个是上图中的foil 002。可以看出,参数(几乎)是一致的,但是形状上却有一定区别。计算上,foil 002性能远不如MH 114。

但这些都是后话,重点是如何用不同的方法把给定参数的翼型画出来。

二次曲线法理论计算

思路就是先确定弯度线和厚度线,然后两者一结合就可以画出翼型了。 我们可以再看一下第一幅图,看看这两条曲线有什么性质。可以很直观地得到,厚度曲线

equation?tex=t%28x%29 经过

equation?tex=%28t_%7B%5Crm+pos%7D%2C+t_%7B%5Crm+val%7D%29 点,并在这一点取得极大值。其中

equation?tex=t_%7B%5Crm+pos%7D 是最大厚度位置,

equation?tex=t_%7B%5Crm+val%7D 是最大相对厚度。弯度曲线同理。另外,厚度曲线在

equation?tex=%280%2C+0%29 处的切线垂直于x轴

首先,我们可以想到用一个二次的曲线去模拟翼型曲线。二次曲线的公式是

equation?tex=F%3Dax%5E2%2Bbxy%2Bcy%5E2%2Bdx%2Bey%2Bf%3D0 。由于翼型过

equation?tex=%280%2C+0%29

equation?tex=%281%2C+0%29 点,很容易知道

equation?tex=f%3D0

equation?tex=d%3D-a

equation?tex=F

equation?tex=x 求导得:

equation?tex=%5Ccfrac%7B%7B%5Crm+d%7DF%7D%7B%7B%5Crm+d%7Dx%7D%3D2ax%2Bby%2Bbxy%27%2B2cyy%27-a%2Bey%27%3D0

把在

equation?tex=%28t_%7B%5Crm+pos%7D%2C+t_%7B%5Crm+val%7D%29 导数为零代入,即令

equation?tex=y%27%3D0 得(用

equation?tex=p%2Cv 代替),即

equation?tex=b%3Da%281-2p%29%2Fv+ 。再把这一点代入曲线表达式(这一点也在曲线上),化简得:

equation?tex=2ap%2Bbv-a%3D0

也就是说到目前为止只有

equation?tex=c

equation?tex=v 是自由参数,其他都由相对厚度及其位置所决定

现在考虑在

equation?tex=%280%2C+0%29 处的导数。

equation?tex=F

equation?tex=y 求导得:

equation?tex=%5Ccfrac%7B%7B%5Crm+d%7DF%7D%7B%7B%5Crm+d%7Dy%7D%3D2axx%27%2Bbx%2Bbx%27y%2B2cy-ax%27%2Be%3D0

equation?tex=%280%2C+0%29

equation?tex=x%27%3D0 代入得:

equation?tex=e%3D0+ 。这样就只有

equation?tex=c 是个自由参数了。但是,这个参数也有一定的限制,对于函数

equation?tex=F%28x%2Cy%29%3D0 ,我们只能保证

equation?tex=%280%2C+0%29 是其一个解,但是

equation?tex=x%3D0

equation?tex=y 却不一定为

equation?tex=0 ,也就是会有两个解。

equation?tex=x%3D1 时同理。我们要做的就是要保证

equation?tex=%280%2C+0%29

equation?tex=%281%2C+0%29 是同侧解,也就是在

equation?tex=%5Cpm 的取值上均取一侧值,否则图像可能变成这样:

蓝色标记的为同侧解 。

分别求出

equation?tex=x

equation?tex=0

equation?tex=1 时的另一个解,是

equation?tex=y%3D-%5Ccfrac%7Be%7D%7Bc%7D

equation?tex=y%3D%5Ccfrac%7Be%2Bb%7D%7Bc%7D 。由两者同号,得出

equation?tex=%5Ccfrac%7Bb%7D%7Be%7D%3E-1 。而

equation?tex=b 的值与

equation?tex=c 有关。这样前期理论就完成的差不多了。代码实现

先定义一个行向量x(数组),从零到一,均分100份。输入四个参数,两两组合可以求出一条曲线(剩下的参数根据约束随意取一个)。比如厚度曲线:

c = -4

e = 0

a = c*v**2/p**2

b = a*(1-2*p)/v

d = -a

之后对每个x,也就是行向量x中的项求对应y值。但是不必写成循环,直接用广播即可。

A = c

B = b*x+e

C = a*x**2+d*x

Delta = B**2-4*A*C

y = (-B-np.sqrt(Delta))/(2*A)

前面各项就是一元二次方程的系数(x也看做常数),Delta是判别式。如果参数都是按照约束条件取的,判别式就不会为负

对于弯度曲线也是一样的,就是e的取值变得自由了。另外,根据之前的公式,曲线两端的导数均可求,左边是-a/e,右边是a/(b+e),可以看出e的实际意义。 这样一个翼型就由四个主要参数和三个次要参数(两条曲线的c和弯度曲线的e)决定。

不过这样画出来的曲线是有问题的,因为x是等分的,所以在前缘附近由于斜率较大点会比较稀疏。所以可以根据初生成的翼型形状重新确定一下x的分布,再画一次翼型。然后将弯度曲线分别加上或减去厚度曲线,就得到最终的翼型,如图所示:

贝塞尔曲线法理论介绍

接下来介绍一下另一种方法,叫做Bezier曲线法。

这种方法的思路在于把曲线分成最大厚度或者最大弯度所在位置的前后两个部分,在这一点上满足一定的连续条件,比如切线和曲率相等。

贝塞尔曲线(CAD中输入spl->m->cv即可调用)是当今计算机辅助制造中最常用的造型曲线之一。具体的原理我就不多做介绍,重点讲一讲他的几个性质。

先给出三个控制点的曲线方程,正好也是二次的:

equation?tex=B%28t%29%3D%281-t%29%5E2P_0%2B2t%281-t%29P_1%2Bt%5E2P_2%2Ct%5Cin%5B0%2C1%5D

其中,

equation?tex=P_i 是第

equation?tex=i 个控制点。贝塞尔曲线由构造点确定,其中始末两个构造点在曲线上,其余不在。

两条曲线端点相连,相切连续的充要条件是

equation?tex=P_2-P_1%3Dk%28P_1%27-P_0%27%29+ ,而曲率连续的必要条件是

equation?tex=P_2-2P_1%2BP_0%3DP_0%27-2P_1%27%2BP_2%27 ,充分条件还得带上相切连续。代码实现

这样,在给定

equation?tex=%280%2C+0%29 处的斜率、极值和极值点后,我们就可以把五个端点写出来了。

P = np.array([(0, 0), (val*k0, val), (pos, val), (0, 0), (1, 0)])

P[3] = (-P[0]+P[4]+2*P[1])/2

第四个点P[3]由其余四个点计算得来。

再定义一个列向量t,从零到一,用广播的思想就可以把整个曲线画出来。

t = np.linspace(0, 1, 101).reshape(101, 1)

cv0 = (1-t)**2*P[0]+2*t*(1-t)*P[1]+t**2*P[2]

cv1 = (1-t)**2*P[2]+2*t*(1-t)*P[3]+t**2*P[4]

cv = np.vstack((cv0, cv1))

需要注意的是,这里的t和之前的x不一样,不是横坐标,而是要把横坐标和纵坐标一起求出来 ,这样就造成了一个问题,弯度曲线和厚度曲线的对应点找不到了,所以不能直接相加,因此还需要对曲线进行线性插值。

for xi in x:

left = np.argmax(cv[0][cv[0]<=xi])

right = np.argmin(cv[0][cv[0]>=xi]

dista = cv[1][right]-cv[1][left]

new_cv.append((xi, cv[1][left]if dista==0 else(cv[0][right]-xi)*cv[1][left]/dista+(xi-cv[0][left])*cv[1][right]/dista))

这样翼型就画好了(这里没处理前缘点疏密问题,处理方法同上,不再赘述):

小结

今天主要介绍了如何参数绘制翼型。共介绍了两种方法,分别是二次曲线法和贝塞尔曲线法。但是绘制翼型远不止这么两种方法,但是思路是一致的。

都看到这了,留个赞呗~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值