2015-04-12 46 views
2

我正尝试使用Excel VBA执行集成。想知道如果我需要整合负指数(因为x/0是不确定的,因此这种近似无法估计它)用于积分负指数的VBA代码

我当前的代码是我将如何做到这一点使用的近似方法:

Function Integral(sExp As String, dMin As Double, dMax As Double, lBit As Long) 
Dim dU As Double 
Dim lU As Long 
dU = (dMax - dMin)/lBit 
For lU = 1 To lBit 
    IntegralTemp = IntegralTemp + Evaluate(Replace(sExp, "u", dMin)) * dU + 0.5 * dU * Abs(Evaluate(Replace(sExp, "u", dMin + dU)) - Evaluate(Replace(sExp, "u", dMin))) 
    dMin = dMin + dU 
Next lU 
Integral = IntegralTemp 
End Function 
+0

请提供您尝试计算积分。并请提供您如何调用您的功能。例如:'i =积分(“u^-2”,2,4,7)'。你期望结果如何?结果如何与您的期望不同? –

+0

=积分(“u ^( - 0.05)”,0,1,500)。结果是#VALUE。 – Harold

+0

你不能评价'0^-n',因为这被零除。但在我看来,积分(x^-0.05)dx = x ^( - 0.05 + 1)/( - 0.05 + 1)+ C = x^0.95/0.95 + C = 100/95 * x^0.95 + 。这个积分的下限为0,上限为1 ='100/95 * 1^0.95 - 100/95 * 0^0.95≈1,052631579'。 –

回答

0

我觉得这是function Evaluate问题。

我尝试解决这一点,并已设法使:

看看这个测试功能:

Function EvaluateTest(str As String) 
    EvaluateTest = Evaluate(str) 
    EvaluateTest = CStr(EvaluateTest) 
End Function 

debug.Print EvaluateTest("0^(-0.05)")显示Error 2007我觉得这是除以零 - >0^(-0.05) for VBA is 0/(0^0.05)

我们可以捕获这个错误,并为那种情况下接受结果= 0

我创建函数使用捕获这1个错误并修改了一下你的功能。试试这个代码:

Function EvaluateCheck(Exp As String) 

Dim EvalCheck As Variant 
EvalCheck = Evaluate(Exp) 

If VarType(EvalCheck) = vbError Then 'evaluate function error 
    Select Case CInt(EvalCheck) 
    Case 2007 ' 0/x 
    'Debug.Print "Evaluate(" & Exp & ") error= " & CStr(EvalCheck); "" 
    EvaluateCheck = 0 
    'Case 2015 ' other problems with evaluate (power) 
    'Debug.Print "Evaluate(" & Exp & ") error= " & CStr(EvalCheck); "" 
    'try use power function not evaluate 
    'FindTmp = WorksheetFunction.Find("^", Exp) 
     'If FindTmp > 0 Then 
     'number_ = CDbl(Mid(Exp, 1, FindTmp - 1)) 
     'Power_ = Mid(Exp, FindTmp + 1, Len(Exp)) 
     'Power_ = Replace(Power_, ".", ",") '<- i have problems with CDbl function i must replace . to , maybe you dont need this line 
     'Power_ = Replace(Replace(Power_, "(", vbNullString), ")", vbNullString) ' we dont need parentheses 
     'PowerDbl = CDbl(Power_) 

     'EvaluateCheck = WorksheetFunction.power(number_, PowerDbl) 

     'Else 
     'Debug.Print "Evaluate(" & Exp & ") error= " & CStr(EvalCheck); " i cant handle that case" 
     'End If 
    Case Else 
    Debug.Print "Evaluate(" & Exp & ") error= " & CStr(EvalCheck); " i cant handle that case" 
    End Select 
Else ' evaluate no error 
EvaluateCheck = EvalCheck 
End If 

End Function 

您的功能:

Function Integral(sExp As String, dMin As Double, dMax As Double, lBit As Long) 

Dim dU As Double 
Dim lU As Long 
Dim eval As Long 
Dim EvaluateVal1 As Double 'Evaluate(Replace(sExp, "u", dMin)) 
Dim EvaluateVal2 As Double 'Evaluate(Replace(sExp, "u", dMin + dU)) 
Dim sExpTmp As String 

dU = (dMax - dMin)/lBit 

For lU = 1 To lBit 

    'check evaluate 
    sExpTmp = Replace(sExp, "u", dMin) 
    EvaluateVal1 = EvaluateCheck(sExpTmp) 
    sExpTmp = Replace(sExp, "u", dMin + dU) 
    EvaluateVal2 = EvaluateCheck(sExpTmp) 

    IntegralTemp = IntegralTemp + EvaluateVal1 * dU + 0.5 * dU * Abs(EvaluateVal1 - EvaluateVal2) 
    dMin = dMin + dU 

Next lU 
Integral = IntegralTemp 
End Function 

的一些结果:

debug.print Integral("u^(-0.05)", 0, 1, 500) 
1,05186339856455 
debug.print Integral("u^(-0.05)", 0.05, 1, 500) 
0,991802803730478 
debug.print Integral("u^(-0.05)", 0.05, 1.05, 500) 
1,0417624389399 
+1

您提到:'debug.Print EvaluateTest(“0.002^0.05)”)'结果是'错误2015'。这是真的,因为有一个很接近的括号。 'debug.Print EvaluateTest(“0.002^0.05”)'= 0.732911438554269 –

+0

@AxelRichter:是的,这么简单的错误......'2015年案例' – Dawid