文号
922216
阅读
7382
回复
0
收藏
2
所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
Python实现冯·卡门曲线计算并显示图例
2023/06/28
原创
IP:广东

基于百度的公式

基于numpy等库进行开发

也可以直接下载打包好的程序

但还是推荐复制代码自行编译,代码在最后

以下是介绍

冯·卡门曲线的功用不再赘述,因为百度比我更准确

以下是程序(不更新)

attachment icon 冯·卡门曲线计算器(仅供娱乐).zip 39.33MB ZIP 81次下载


以下是算式

\[\begin{array}{l} \theta {\rm{ = }}{\cos ^{ - 1}}(1 - \frac{{2x}}{L})\\ y = \frac{R}{{\sqrt \pi  }}\sqrt {\theta  - \frac{{\sin (2\theta )}}{2} + C{{\sin }^3}\theta } \end{array}\]

解析

L是长度

R是半径

在之后可能会继续更新


以下是效果图

在显示图标之后命令行窗口弹出的数据即为取样点和计算结果

Snipaste_2023-06-24_11-43-38.png

C = 1/3时的图像-20230909更新

image.png image.png

新添功能:自动比较出于目标直径最靠近的点

以下是代码(暂时停止同步,最近一次同步发生在20230910)

import math
import numpy as np
import matplotlib.pyplot as plt

print("冯·卡门曲线计算器——仅供娱乐"
      "\n版本号0.0.0.dev\n"
      "LD-Haack C= 0\n"
      "暂未启用(LV-Haack C= 1/3)\n"
      "长度最长30单位,宽度无限制,命令行输出即为结果")
PLong = 30 + 1#长度为30
#PLong = int(input("长度:")) +1
Xlab = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]#取样点,长度
#
ROP = 20#末端直径
#ROP = int(input("半径:"))
Syssign = 1
Count = 0
XOIP = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]#暂时存储数据的容器,取样点有多少它就得有多少
Yout = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]#输出点,同上要求
pai = [3.14159265]

MODEset = 2# 如果模式设置为2 ,则C=1/3 1则为C=0

while(Syssign):
    SentPL = 0.00
    SentPL = 2*Xlab[Count]/PLong
    #print(SentPL)
    XOIP[Count] = 1-SentPL
    Count += 1
    if(Count == PLong):
        Syssign = 0
        Count = 0
ARCX = np.arccos(XOIP)

plt.plot(Xlab, ARCX,
         color='yellow', marker="o")
Syssign = 1
while(Syssign):
    XOIP[Count] = ARCX[Count] * 2
    Count += 1
    if(Count == PLong):
        Syssign = 0
        Count = 0
XOIP = np.sin(XOIP)

Syssign = 1
while(Syssign):
    XOIP[Count] = XOIP[Count] / 2
    Count += 1
    if(Count == PLong):
        Syssign = 0
        Count = 0


Syssign = 1
while(Syssign):
    XOIP[Count] = ARCX[Count]  - XOIP[Count]
    Count += 1
    if(Count == PLong):
        Syssign = 0
        Count = 0
#如果情况是C = 0则忽略该段,如果是1/3还需要加一个1/3Sin角度的三次方
Syssign = 1
CSINT = ARCX
Count = 3
while(Count >=1):
    CSINT = np.sin(CSINT)
    Count -= 1
print(Count)
Count = 0
if MODEset == 2:
    while(Syssign):
        CSINT[Count] = CSINT[Count]/3
        XOIP[Count] = XOIP[Count] + CSINT[Count]
        Count += 1
        if(Count == PLong):
            Syssign = 0
            Count = 0
#
XOIP = np.sqrt(XOIP)
pai = np.sqrt(pai)

Syssign = 1
while(Syssign):

    Yout[Count] = XOIP[Count] * ROP/pai#注意,这里是根号pai
    Count += 1
    if(Count == PLong):
        Syssign = 0
        Count = 0

Syssign = 1
while(Syssign):
    print("\n\nX:")
    print(Xlab[Count])
    print("Y:")
    print(Yout[Count])
    Count += 1
    if(Count == PLong):
        Syssign = 0
        Count = 0

plt.plot(Xlab, Yout,
         color='blue', marker="o")

#plt.plot(Xlab, out_array2,
#         color='red', marker="o")

plt.title("BLUE:OUTPUT\nyellow:rad")
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

以下是实现临近匹配的,由于属于另一个项目,因而只把部分功能实现到这里

while(Syssign):
   print("\n\nX:")
   print(Xlab[Count])
   print("Y:")
   print(Yout[Count])
   if Yout[Count] <= FOPC:
       ZDsign = 1
   if ZDsign == 1:
       if Yout[Count] >= FOPC:
           ZDsign = 2
           print("数据的最近似点已采集")
           #由于是最靠近的较大数字,因此用减去较小数字来实现逐步逼近的效果

           EPSD = Count
           print(EPSD)
   Count += 1
   if(Count == PLong):
       Syssign = 0
       Count = 0

可以自行寻找合适的点进行替换(但其实不如自己插入进去)

20230910

[ 修改于3年2个月前 - 2023/09/10 01:00:00 ]
来自:
数理化/数学
0
4
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的