将复杂的公式转换为动态数组

问题描述 投票:0回答:2

尝试从有点复杂的公式创建动态数组,但不断随机收到#N/A错误。

enter image description here

由于某种原因,方程的 y 值不喜欢它。

实际上,第一个实例中的

#N/A
表示在左侧的粒径表中找不到 0.57,尽管已明确列出。

要模仿的数据:

表1:

粒径δ(μm) 机载(δ) (kg/s) γ(δ)
0.00 0 0.000555556
0.19 2.33195E-15 0.000556338
0.38 5.3411E-15 0.000558686
0.57 7.49672E-15 0.000562599
0.76 8.93319E-15 0.000568078
0.95 9.85973E-15 0.000575121
1.14 1.04323E-14 0.00058373
1.33 1.07581E-14 0.000593905
1.52 1.09105E-14 0.000605644
1.71 1.09403E-14 0.000618949
1.90 1.0883E-14 0.000633819
2.09 1.07639E-14 0.000650254

输入参数:

喷雾持续时间(分钟)
11.1

有问题的公式:

=MAKEARRAY(10,11,LAMBDA(x,y,IF(x*7.8 <= InputParameters[[Spray Duration (minutes)]:[Spray Duration (minutes)]] * 60,

XLOOKUP(y*0.19, Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[Rairborne(δ) (kg/s)]:[Rairborne(δ) (kg/s)]]) *
    (1 - EXP(-XLOOKUP(y*0.19, Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[γ(δ)]:[γ(δ)]]) * x*7.8)) /
    XLOOKUP(y*0.19, Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[γ(δ)]:[γ(δ)]]),

XLOOKUP(y*0.19, Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[Rairborne(δ) (kg/s)]:[Rairborne(δ) (kg/s)]]) /
    XLOOKUP(y*0.19, Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[γ(δ)]:[γ(δ)]]) *
    (1 - EXP(-XLOOKUP(y*0.19, Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[γ(δ)]:[γ(δ)]]) * (InputParameters[[Spray Duration (minutes)]:[Spray Duration (minutes)]] * 60))) *
    EXP(-XLOOKUP(y*0.19, Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[γ(δ)]:[γ(δ)]]) * (x*7.8 - (InputParameters[[Spray Duration (minutes)]:[Spray Duration (minutes)]] * 60)))
)))

正确数据(使用长公式并拖动时)(颗粒大小在顶部,时间在 LHS 下方):

| TIME (s) | 0       | 0.19    | 0.38    | 0.57    | 0.76    | 0.95    |
|----------|---------|---------|---------|---------|---------|---------|
| 0        | 0.00E+00| 0.00E+00| 0.00E+00| 0.00E+00| 0.00E+00| 0.00E+00|
| 7.80     | 0.00E+00| 1.81E-14| 4.16E-14| 5.83E-14| 6.95E-14| 7.67E-14|
| 15.60    | 0.00E+00| 3.62E-14| 8.30E-14| 1.16E-13| 1.39E-13| 1.53E-13|
| 23.40    | 0.00E+00| 5.42E-14| 1.24E-13| 1.74E-13| 2.08E-13| 2.29E-13|
| 31.20    | 0.00E+00| 7.21E-14| 1.65E-13| 2.32E-13| 2.76E-13| 3.05E-13|
| 39.00    | 0.00E+00| 9.00E-14| 2.06E-13| 2.89E-13| 3.45E-13| 3.80E-13|
| 46.80    | 0.00E+00| 1.08E-13| 2.47E-13| 3.46E-13| 4.13E-13| 4.55E-13|
| 54.60    | 0.00E+00| 1.25E-13| 2.87E-13| 4.03E-13| 4.80E-13| 5.30E-13|
| 62.40    | 0.00E+00| 1.43E-13| 3.28E-13| 4.60E-13| 5.48E-13| 6.04E-13|
| 70.20    | 0.00E+00| 1.61E-13| 3.68E-13| 5.16E-13| 6.15E-13| 6.78E-13|
| 78.00    | 0.00E+00| 1.78E-13| 4.08E-13| 5.72E-13| 6.82E-13| 7.52E-13|
| 85.80    | 0.00E+00| 1.95E-13| 4.47E-13| 6.28E-13| 7.48E-13| 8.25E-13|

出于某种原因,它似乎认为这是代码,并且不会让我提交,除非格式化为代码,尽管使用了 markdown

图像中的工作簿链接:

https://1drv.ms/x/s!AsrLaUgt0KCLxXOWIrFQWEaQoxky?e=vnORUu

更新1添加&"":

enter image description here

更新2 添加 TRUE 并设置 y*0.19 到数组

enter image description here

excel excel-formula dynamic-arrays
2个回答
1
投票

对于这样的公式,通常最好删除冗余,以便您可以更轻松地了解发生了什么。

这似乎有效:

=MAKEARRAY(
    10,
    11,
    LAMBDA(x, y,
        LET(
            columnLookup, ROUND(y * 0.19, 2),
            particleDiameter, ROUND(Table1[Particle Diameter δ (μm)], 2),
            sprayDuration, TAKE(InputParameters[Spray Duration (minutes)], 1, 1),
            gammaOfDelta, XLOOKUP(columnLookup, particleDiameter, Table1[γ(δ)]),
            rairBorne, XLOOKUP(columnLookup, particleDiameter, Table1[Rairborne(δ) (kg/s)]),
            IF(
                x * 7.8 <= sprayDuration * 60,
                rairBorne * (1 - EXP(-gammaOfDelta * x * 7.8)) / gammaOfDelta,
                rairBorne / gammaOfDelta * (1 - EXP(-gammaOfDelta * (sprayDuration * 60))) *
                    EXP(-gammaOfDelta * (x * 7.8 - (sprayDuration * 60)))
            )
        )
    )

enter image description here

顺便说一句,MAKEARRAY 是一个缓慢的函数。如果可以的话,最好使用 SEQUENCE,所以在我的版本中,我使用 SEQUENCE 作为行和列标题:

=SEQUENCE(11,,7.8,7.8)
=SEQUENCE(,11,0.19,0.19)

1
投票

这与浮点计算有关:https://spreadsheetweb.com/floating-point-calculation-issues-excel/

解决方法可以是使用引用单元格的索引,而不是计算这些值:

=MAKEARRAY(10,11,LAMBDA(x,y,IF(x*7.8<=Table2[Spray Duration (minutes)] * 60,XLOOKUP(INDEX(J4:T4,,y), Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[Rairborne(δ) (kg/s)]:[Rairborne(δ) (kg/s)]]) *    (1 - EXP(-XLOOKUP(INDEX(J4:T4,,y), Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[γ(δ)]:[γ(δ)]]) * x*7.8)) /    XLOOKUP(INDEX(J4:T4,,y), Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[γ(δ)]:[γ(δ)]]),XLOOKUP(INDEX(J4:T4,,y), Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[Rairborne(δ) (kg/s)]:[Rairborne(δ) (kg/s)]]) /    XLOOKUP(INDEX(J4:T4,,y), Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[γ(δ)]:[γ(δ)]]) *    (1 - EXP(-XLOOKUP(INDEX(J4:T4,,y), Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[γ(δ)]:[γ(δ)]]) * (Table2[Spray Duration (minutes)]* 60))) *    EXP(-XLOOKUP(INDEX(J4:T4,,y), Table1[[Particle Diameter δ (μm)]:[Particle Diameter δ (μm)]], Table1[[γ(δ)]:[γ(δ)]]) * (x*7.8 - (Table2[Spray Duration (minutes)] * 60))))))

(我使用Table2,因为在应用程序版本中我无法更改表的名称)。

© www.soinside.com 2019 - 2024. All rights reserved.