我正在用numpy在python中开发一个有限体积的传热模型。我有许多垂直堆叠的单元(第二年计划转移到三维模型),每个单元都有不同的温度。
*为了计算电池之间的热传递,我需要根据电池温度的热导率。
具有相应温度(以摄氏度为单位)的热导率存储在矩阵TC
中,单元温度(以摄氏度为单位)存储在矢量中(将来在矩阵中)T_Cell
。这些数组看起来像:
TC = numpy.array([[0,569],[1,574],[2,582],[3,590],[4,598],[5,606],[6,613],[7,620]])
T_Cell = numpy.array([[7],[5],[5],[4],[4],[3],[1],[0],[0]])
TC
中的温度对应于它们的行索引,因此可以通过索引温度(存储在T_Cell中的值)来获取例如电池温度T_Cell=5
的热导率。 )。此处显示的是索引为2的单元格:
TC_Cell = TC[numpy.round(T_Cell[2]),1]
导致TC_Cell = 606
。
是否有一个阵列操作允许我在与T_Cell
形状相同的阵列中获得单元的导热系数(仅取决于单元的温度)?例如,TC
和T_Cell
的数组如上所示:
TC_Cell = TC[T_Cell, 1]
因此TC_Cell的结果如下:
TC_Cell = array([[620],
[606],
[606],
[598],
[598],
[590],
[574],
[569],
[569]])
不需要插值,因为我已经将TC中的值插值到令人满意的程度(此处未示出以保持其清洁,数组中的值也被简化且物理上不正确)。*
我真的不知道为什么,但突然之间它的工作方式与我的例子中显示的完全一样......也许我的代码中有一个错字...: - /虽然我的第二个问题仍未得到解决。
我的第二个问题是: 我有一个微分方程,其解决方案根据一个参数是零还是非零而变化。该参数取决于单元格,因此它可能是
Arg = numpy.array([[0.12],[0.9],[0],[0],[0.2]])
目前,我决定使用哪种解决方案的方法是在Arg
- 向量(将来:3d-array)上运行for循环,并检查单元格是否为0
。像:
a=1
c=2
d=3
for cell in range(numpy.size(Arg, 0)):
if Arg[cell, 0] != 0:
# Solution1:
Solution[cell] = (a / Arg[cell] + c) * numpy.e**(Arg[cell] * d) - (a / Arg[cell])
elif Arg[cell, 0] == 0:
# Solution2:
Solution[cell] = a * d + c
结果:
Solution = array([[ 6.47773728],
[ 45.18138759],
[ 5. ],
[ 5. ],
[ 7.7548316 ]])
是否有一个数组操作,我可以避免使用for循环?
为了避免由于缺少信息而导致的进一步混淆:a
也是一个与Arg
大小/形状相同的数组:
a = numpy.array([[1],[1],[1],[1],[1]])
(值不一定是1
!)
提前感谢您的帮助!
答案 0 :(得分:2)
试试这个:
[a,b,c] = [1,2,3]
Arg = numpy.array([[0.12],[0.9],[0],[0],[0.2]])
Solution = Arg
Solution[Solution ==0] = 1
Solution = Solution * a * b * c
print(Solution)
返回:
[[ 0.72]
[ 5.4 ]
[ 6. ]
[ 6. ]
[ 1.2 ]]
不要试图将0
中的Arg
值保留在乘法之外,只需将它们更改为1
,这在乘法中是中性的,因此具有与避免相同的效果乘法。