Python 如何迭代一个有3个变量的函数?

Python 如何迭代一个有3个变量的函数?,python,Python,这个函数由3个变量xvalue,p,C定义 we have f(xvalue, P, C) = a formula 这个公式为我的数据提供了一个近似值。所以,我希望这个函数给出一个非常接近数据值的列表 所有3个变量都有29个值,因此我对所有3个变量都使用linespace命令 这是我写的代码 G = 6.687*(10**(-11)) pie = 3.14159265358979 xvalue = np.linspace(8, 37, 29)*(3.086*(10**(19))) def f(

这个函数由3个变量xvalue,p,C定义

we have f(xvalue, P, C) = a formula
这个公式为我的数据提供了一个近似值。所以,我希望这个函数给出一个非常接近数据值的列表

所有3个变量都有29个值,因此我对所有3个变量都使用linespace命令

这是我写的代码

G = 6.687*(10**(-11))
pie = 3.14159265358979
xvalue = np.linspace(8, 37, 29)*(3.086*(10**(19)))
def f(xvalue, P, C):
    return ((G*(((2*pie*(C)**3*P*((2*(xvalue+C)**2) * (np.log(xvalue+C)) +4*C*xvalue + 3*(C)**2 ))/(xvalue+C)**2) - (2*pie*(C)**3*P*(2*np.log(C) + 3))))**(1/2))/(xvalue)**(1/2)
f( (np.linspace(8, 37, 30)*(3.086*(10**(19)))), (np.linspace(5, 10, 30)*(10**(-20)))  , (np.linspace(2, 9, 30)*(10**(19)))) 
我得到的结果是

array([ 41057.48335783,  46766.86571009,  52630.23811206,  58644.17375691,
        64805.45233656,  71111.04022756,  77558.07341632,  84143.842609  ,
        90865.78013739,  97721.44837086, 104708.52940819, 111824.81586818,
       119068.2026304 , 126436.67940272, 133928.32401215, 141541.29633103,
       149273.83276362, 157124.24122895, 165090.89658431, 173172.23644133,
       181366.75733289, 189673.01119427, 198089.60212662, 206615.18341451,
       215248.45477286, 223988.15980131, 232833.08362655, 241782.05071537,
       250833.92284304, 259987.59720332])
 
具有29个值的数组。 但是,我想得到29个以上的值。 为了澄清,我得到的价值观是

 f(x[0], P[0], C[0])
 f(x[1], P[1], C[1])
 f(x[2], P[2], C[2])
 f(x[3], P[3], C[3])....
 f(x[29], P[29], C[29])
然而,为了更好地逼近我的数据,我需要像这样的单个元素的迭代

f(x[0], P[0], C[0]) 
 f(x[0], P[1], C[0])
 f(x[0], P[2], C[0])
 f(x[0], P[3], C[0]).....
 f(x[0], P[29], C[0])
然后计算机获取下一组值

 f(x[1], P[0], C[0]) 
 f(x[1], P[1], C[0])
 f(x[1], P[2], C[0])
 f(x[1], P[3], C[0])....
 f(x[1], P[29], C[0])
这一直持续到x达到29。但是,C仍然是零。所以我需要再次重复这个过程,但这次我需要把C的值设为1

我不知道如何在代码中实现这个过程。有没有一种更简单的方法来实现这一点,而不必手动重新输入值?

查看itertools-您正在寻找的

import itertools as it

prods = it.product(range(30), repeat=3)
for prod in prods:
    print(prod)
它将首先递增c,然后递增b,然后递增a查看您正在寻找的itertools

import itertools as it

prods = it.product(range(30), repeat=3)
for prod in prods:
    print(prod)
它将首先递增c,然后递增b,然后递增a。您可以使用numpy.meshgrid进行此操作

import numpy as np


X = np.linspace(-4, 4, 11)
Y = range(-5, 6)
Z = range(-3, 4)

x_1, y_1, z_1 = np.meshgrid(X, Y, Z)
  
for x, y, z in zip(x_1.ravel(), y_1.ravel(), z_1.ravel()):
    print(x, y ,z)
评估所有点的函数很简单:

f(x_1.ravel(), y_1.ravel(), z_1.ravel())
可以使用numpy.meshgrid进行此操作

import numpy as np


X = np.linspace(-4, 4, 11)
Y = range(-5, 6)
Z = range(-3, 4)

x_1, y_1, z_1 = np.meshgrid(X, Y, Z)
  
for x, y, z in zip(x_1.ravel(), y_1.ravel(), z_1.ravel()):
    print(x, y ,z)
评估所有点的函数很简单:

f(x_1.ravel(), y_1.ravel(), z_1.ravel())

仅供参考,您只需编写6.687e-11和3.086e19,而不是6.687*10**-11和3.086*10**19。非常感谢!仅供参考,您只需编写6.687e-11和3.086e19,而不是6.687*10**-11和3.086*10**19。非常感谢!这将为我返回非整数值。我认为它们不适用于索引数组。你可以用任何东西替换值列表。如果需要整数,可以使用X=range-4,5。这会为我返回非整数值。我认为它们不适用于索引数组。你可以用任何东西替换值列表。如果你需要整数,你可以使用X=range-4,5。如果你需要按一定的顺序使用参数,你可以传递X[prod[2]],P[prod[1]],C[prod[0]-例如,它的顺序相反,首先递增a,然后递增b,然后递增C。谢谢!我将研究它并尝试代码一旦我得到笛卡尔积,我如何将每个积输入公式?您可以通过索引0、1和2访问每个元素。然后像以前一样输入数组,但使用上面prod数组中的一个元素作为索引。非常感谢您的帮助!如果您需要按特定顺序输入参数,您可以传递x[prod[2]]、P[prod[1]]、C[prod[0]],例如,它的顺序相反,首先递增a,然后递增b,然后递增C。谢谢!我将研究它并尝试代码一旦我得到笛卡尔积,我如何将每个积输入公式?您可以通过索引0、1和2访问每个元素。然后像以前一样输入数组,但使用上面prod数组中的一个元素作为索引。非常感谢您的帮助!