ﻩ并啵了你一下ﻩsong宋 2021-04-20 15:12 采纳率: 100%
浏览 123
已采纳

请问大佬们,Python自定义的函数不可以循环调用吗o(╥﹏╥)o

import numpy as np

X0 = np.arange(-1, 101, 1.0)  # 炮检距(中心点即目标点),-1-100
X = np.zeros(90)  # 射线经过的水平距离
ag = np.zeros((5, 101))  # 找到适合水平距离的粗始入射角变量,5行101列适用于4层100个炮检距
agi = np.arange(0, 90, 1.0)  # 设置入射角数组,1度为步长,0-89
a = np.zeros((5, 101))  # 反射点处的入射角,5行101列适用于4层100个炮检距
Vp = [0, 3700, 2400, 3000, 2000]  # 层状速度数组
H = [0, 60, 20, 40, 20]  # 层厚度数组


def angle_function(m, n):  # 定义子函数,计算层数为n、炮检距为m的入射角
    for j in range(90):
        for i in range(m + 1):
            P = np.sin(agi[j] * np.pi / 180) / Vp[1]
            # print(P*Vp[i], 1 - (P * Vp[i]) ** 2)
            X[j] += 2 * H[i] * P * Vp[i] / np.sqrt(1 - (P * Vp[i]) ** 2)
        if X[j - 1] < X0[n] < X[j]:  # 适合水平距离时停止增加入射角角度
            for l in range(50):  # 二分法精确化入射角
                ag[m][n] = (agi[j - 1] + agi[j]) / 2.0
                for k in range(m + 1):
                    P = np.sin(ag[m][1] * np.pi / 180) / Vp[1]
                    X[l] += 2 * H[k] * P * Vp[k] / np.sqrt(1 - (P * Vp[k]) ** 2)
                if abs(X[l] - X0[n]) > 0.5:
                    if X[l] > X0[n]:
                        agi[j - 1] = agi[j - 1]
                        agi[j] = ag[m][n]
                    if X[l] < X0[n]:
                        agi[j - 1] = ag[m][n]
                        agi[j] = agi[j]
                else:
                    break
            break

# 循环调用子函数
for p in range(5):
    for q in range(101):
        angle_function(p, q)
print(ag)

如上,循环调用子函数,结果大部分为零

import numpy as np

X0 = np.arange(-1, 101, 1.0)  # 炮检距(中心点即目标点),-1-100
X = np.zeros(90)  # 射线经过的水平距离
ag = np.zeros((5, 101))  # 找到适合水平距离的粗始入射角变量,5行101列适用于4层100个炮检距
agi = np.arange(0, 90, 1.0)  # 设置入射角数组,1度为步长,0-89
a = np.zeros((5, 101))  # 反射点处的入射角,5行101列适用于4层100个炮检距
Vp = [0, 3700, 2400, 3000, 2000]  # 层状速度数组
H = [0, 60, 20, 40, 20]  # 层厚度数组


def angle_function(m, n):  # 定义子函数,计算层数为n、炮检距为m的入射角
    for j in range(90):
        for i in range(m + 1):
            P = np.sin(agi[j] * np.pi / 180) / Vp[1]
            # print(P*Vp[i], 1 - (P * Vp[i]) ** 2)
            X[j] += 2 * H[i] * P * Vp[i] / np.sqrt(1 - (P * Vp[i]) ** 2)
        if X[j - 1] < X0[n] < X[j]:  # 适合水平距离时停止增加入射角角度
            for l in range(50):  # 二分法精确化入射角
                ag[m][n] = (agi[j - 1] + agi[j]) / 2.0
                for k in range(m + 1):
                    P = np.sin(ag[m][1] * np.pi / 180) / Vp[1]
                    X[l] += 2 * H[k] * P * Vp[k] / np.sqrt(1 - (P * Vp[k]) ** 2)
                if abs(X[l] - X0[n]) > 0.5:
                    if X[l] > X0[n]:
                        agi[j - 1] = agi[j - 1]
                        agi[j] = ag[m][n]
                    if X[l] < X0[n]:
                        agi[j - 1] = ag[m][n]
                        agi[j] = agi[j]
                else:
                    break
            break


angle_function(4, 100)
angle_function(4, 99)
angle_function(4, 98)
angle_function(4, 97)
angle_function(4, 96)
angle_function(4, 95)
angle_function(4, 94)
angle_function(4, 93)

print(ag)

这样一行一行调用,就能正常计算出ag。难道真的要一行一行的调用吗o(╥﹏╥)oo(╥﹏╥)o

  • 写回答

7条回答 默认 最新

  • kaili_ya 2021-04-20 16:34
    关注
    import numpy as np
     
    X0 = np.arange(-1, 101, 1.0)  # 炮检距(中心点即目标点),-1-100
    X = np.zeros(90)  # 射线经过的水平距离
    ag = np.zeros((5, 101))  # 找到适合水平距离的粗始入射角变量,5行101列适用于4层100个炮检距
    agi = np.arange(0, 90, 1.0)  # 设置入射角数组,1度为步长,0-89
    a = np.zeros((5, 101))  # 反射点处的入射角,5行101列适用于4层100个炮检距
    Vp = [0, 3700, 2400, 3000, 2000]  # 层状速度数组
    H = [0, 60, 20, 40, 20]  # 层厚度数组
     
    def angle_function(m, n):  # 定义子函数,计算层数为n、炮检距为m的入射角
        for j in range(90):
            for i in range(m + 1):
                P = np.sin(agi[j] * np.pi / 180) / Vp[1]
                # print(P*Vp[i], 1 - (P * Vp[i]) ** 2)
                X[j] += 2 * H[i] * P * Vp[i] / np.sqrt(1 - (P * Vp[i]) ** 2)
            if X[j - 1] < X0[n] < X[j]:  # 适合水平距离时停止增加入射角角度
                for l in range(50):  # 二分法精确化入射角
                    ag[m][n] = (agi[j - 1] + agi[j]) / 2.0
                    for k in range(m + 1):
                        P = np.sin(ag[m][1] * np.pi / 180) / Vp[1]
                        X[l] += 2 * H[k] * P * Vp[k] / np.sqrt(1 - (P * Vp[k]) ** 2)
                    if abs(X[l] - X0[n]) > 0.5:
                        if X[l] > X0[n]:
                            agi[j - 1] = agi[j - 1]
                            agi[j] = ag[m][n]
                        if X[l] < X0[n]:
                            agi[j - 1] = ag[m][n]
                            agi[j] = agi[j]
                    else:
                        return ag
                return ag
            
    
    # 循环调用子函数
    for i in range(100,92,-1):
        ag = angle_function(4, i)
    print(ag)

    把你的break换成return ag,这样有返回值,就可以在上一步的基础上进行继续迭代运算,这里调用

    for i in range(100,92,-1):
        ag = angle_function(4, i)
    print(ag)

    等同于你的

    angle_function(4, 100)
    angle_function(4, 99)
    angle_function(4, 98)
    angle_function(4, 97)
    angle_function(4, 96)
    angle_function(4, 95)
    angle_function(4, 94)
    angle_function(4, 93)
    
    print(ag)

    你可以换成你之前那个循环就可以实现了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效