Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
积分负指数的VBA代码_Vba_Excel_Math_Calculus - Fatal编程技术网

积分负指数的VBA代码

积分负指数的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

我正在尝试使用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
    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)”)
show
Error 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不必要