积分负指数的VBA代码
我正在尝试使用Excel VBA执行集成。我想知道如果我需要积分一个负指数(因为x/0是未定义的,因此这种近似法无法估计它),我将如何使用近似方法来进行此操作 我目前的代码是:积分负指数的VBA代码,vba,excel,math,calculus,Vba,Excel,Math,Calculus,我正在尝试使用Excel VBA执行集成。我想知道如果我需要积分一个负指数(因为x/0是未定义的,因此这种近似法无法估计它),我将如何使用近似方法来进行此操作 我目前的代码是: 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
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
也许可以使用蒙特卡罗技术来估计值 这里有一篇维基百科文章介绍这种方法:
我认为这是
函数求值的问题
我尝试解决这个问题,并成功地做到:
看看这个测试函数:
Function EvaluateTest(str As String)
EvaluateTest = Evaluate(str)
EvaluateTest = CStr(EvaluateTest)
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 EvaluateTest(“0^(-0.05)”)
showError 2007
我认为这是除以0->0^(-0.05),因为VBA是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
一些结果:
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
请提供您试图计算的积分。请提供如何调用函数。示例:i=Integral(“u^-2,2,4,7)
。你期望结果如何?结果与您的期望有什么不同。=积分(“u^(-0.05)”,0,1500)。结果是#VALUE。您不能计算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+C
。此积分的下限为0,上限为1=100/95*1^0.95-100/95*0^0.95≈ 1052631579
。您提到:debug.Print EvaluateTest(“0.002^0.05”)
结果是Error 2015
。这是真的,因为这里有一个结束括号<代码>调试.Print EvaluateTest(“0.002^0.05”)
=0。732911438554269@AxelRichter:是的,这么简单的错误<代码>案例2015不必要