我可以使用内置的Excel解算器以某种方式解决这个等式吗?如果没有,你会怎么做?

时间:2013-05-28 18:46:16

标签: excel excel-vba excel-2010 vba

首先,让我告诉大家相关的等式。

CFL Equation

在该等式中,S,V和t是已知常数。 CFL也是众所周知的。我们有D的初始值,我们不知道k是什么。

我需要做的是找到D和k的理想值,这将使计算的CFL和测量的CFL的残差平方最小化。使用残差平方只是我检查它们是否是最佳值的一种方法,但是如果还有另一种方法可以使用其他方法,那就没问题。

残差平方只是计算和测量的CFL之间差值的绝对值,然后是平方。残差平方越低,我们的拟合越好。所以我需要将k和D都放入等式中得到的最小残差平方。这将导致计算出的CFL,然后我可以将其与测量的CFL进行比较,从而允许我计算残差平方。

我的第一个想法是如何做到这一点,因为我不确定如何使用Excel方程式,是为了修正D的值(因为我们有一个初始起始值来工作),然后通过不同的值来改变k,将它们放入等式中以找到计算的CFL,并将其与测量结果进行比较以找到残差平方,直到我找到一个残差平方最小的结果。然后我将k固定在理想值,然后改变D直到我找到那里最小的残差。然后我再次修复D,然后回到变化的k。我的想法是,我可以像往常一样来回反复,直到D和k都在他们先前值的某个百分比之内。我认为它会与这种方法达到某种平衡

然而,这些数字只是变得疯狂,最终要么变为零,要么变为无穷大。所以我需要重新修改我的过程。这是你们进来的地方!

你会如何为D和k找到最理想的值,这会导致计算出的CFL最接近测量值,假设你给出的每个变量的值都高于k?请记住,最初给出的D值只是起作用的起点,而不是最理想的值。

我一直在研究这个项目很长一段时间(至少一个月),我只是陷入了地狱和绝望的境地。我希望你们能帮助我。

以下是一些可以使用的初始值:

S = 19.634954

V = 12.271846

D(初始)= 0.01016482

CFL(测量)= 0.401

t = 4

k =?

感谢您提出任何想法。

2 个答案:

答案 0 :(得分:1)

在1公式系统中无法解决两个未知变量。但是,如果我按照给定的D那么你有1个未知/ 1公式系统。

我只是简单地使用1列作为k的猜测(对于我的列B。我使用了另一列来表示计算出的CFL,其中包含猜测的k(对于我的列C我有另一个列有1或-1(对于我的列D)。最后我有一个列,表示我想增加猜测的绝对值。

我使用给定的变量值命名单元格,以便更容易使用它们。

我开始猜测k=1。 这是我的第一行中的公式,即7。

B7 = .1

C7 =(s/v)*(d/B7)^0.5*(ERF(((B7*t)^0.5))+((B7*t)/PI())^0.5*EXP(-1*B7*t))

D7或E7中没有任何内容

第8行

: B8 = B7+E8+D8 C8 = =(s/v)*(d/B8)^0.5*(ERF(((B8*t)^0.5))+((B8*t)/PI())^0.5*EXP(-1*B8*t)) D8 = 1 E8 = .01

在第9行中,B和C列只是向下复制,但D和E如下所示 D9 = =IF(C9>cfl,1,-1) E9 = =IF(D9=D8,E8,E8/10)

一旦你获得了这些,你可以复制你想要的许多行。

这样做的每次CFL开关的残余标志时,增量符号也会翻转。此外,增量的绝对值也将缩小10倍,以提供更高的精度。

这绝不是解决问题的最佳方法,但这是一种方式。

答案 1 :(得分:1)

正如Dean所说,你的系统有两个未知数,一般情况下有无数个解(不同的(D,k)对)。通过修正DCFLk的连续函数,因此,您应该能够找到一个k,其中包含您测量的CFL (在某种程度上准确)。对于此问题(即,找到k给定CFL),您可以使用目标搜索工具。方法如下:

1)问题设置: 使用变量名称来命名输入其值的单元格(转到公式 - >定义名称 - >定义名称,并将每个变量的名称提供给单元格)。然后在这些单元格中输入参数的值(给k一个任意值,例如= 1),并在单元格CFL中输入公式,如: =(S/V)*SQRT(D/k)*(ERF(SQRT(k*t))+SQRT(k*t/PI())*EXP(-k*t)) 再次注意,S,V,D,kt被定义为命名范围。

2)问题解决方案: 转到数据 - >数据工具 - >假设分析 - >目标寻求并输入以下参数: 设置单元格:CFL 价值:0.401 通过更改单元格:k

这给了我k=0.151759378,结果为CFL = 0.401261265054823

enter image description here

我希望这有帮助吗?

编辑:使用VBA查找一些解决方案对:

1)将测量的CFL值放在单元格中(我选择H2)。

2)替换命名范围kDCFL。我使用了rngKrngDrngCFL,每个都从第2行开始直到第20行。

3)使用公式rngD向下填充=INDEX(rngD,ROW()-ROW($C$2))+0.01一步(我用0.01)。 rngD的第一个条目位于单元格C2中,其值为0.01016482。公式将被复制到范围内的所有其他单元格。

4)使用一些初始值(rngK)填写=1

5)使用公式rngCFL填写=(S/V)*SQRT(INDEX(rngD,ROW()-ROW($G$1))/INDEX(rngK,ROW()-ROW($G$1)))*(ERF(SQRT(INDEX(rngK,ROW()-ROW($G$1))*t))+SQRT(INDEX(rngK,ROW()-ROW($G$1))*t/PI())*EXP(-INDEX(rngK,ROW()-ROW($G$1))*t))范围。我使用ROW()INDEX()函数来引用我需要的Range元素。

6)最后,在sub:

中使用此代码
Dim iCnt As Long
For iCnt = 1 To Range("rngk").Count
    Range("rngCFL")(iCnt).GoalSeek goal:=Range("H2"), changingCell:=Range("rngK")(iCnt)
Next iCnt

上面会生成19对(D,k),它们会给出测量的CFL值。