ªð¦^¦Cªí ¤W¤@¥DÃD µo©«

EXCEL VBA¨D¤@¤¸¤G¦¸¤èµ{¦¡ (¤£¥Î¤½¦¡¸Ñ)(2)

¥»©«³Ì«á¥Ñ ML089 ©ó 2021-10-23 16:43 ½s¿è

'¤@¤¸¤G¦¸¤èµ{¦¡:X2+2X-4=0 ,
'¥Î¤½¦¡¸Ñx=(-b¡Ó¡Ôb^2-4ac)/2aªº¤è¦¡¡A
'¥i¥H¨D¥XX1=1.23606797749979 X2=-3.2360679774997

'°O±o30¦~«eªì¾ÇFortran»y¨¥®É¡A½m²ß¹L ¤û¹yXX¸Ñªk¡A¬ù3~5¨B´N¥i¥H¨D¥Xªñ¦ü¸Ñ¡Aºô¸ô¤W§ä¤@¤U«Ü¦h¡C
'²{¦b¹q¸£­pºâ¯à¤O¤Ó±j¤F¡A¥i¥H«Ü¼É¤Oª½±µ¥Ñ -10000 ­pºâ¨ì 10000¡A¥Hf(x)¡Bf(x+s)¨â¼Æ­È»~®t¦b¤p¼Æ12¦ì¼Æ®É§@¬°ªñ¦ü¸Ñ¡C
'´`Àô¦¸¼Æ¬ù20000½d³ò+500~800¦¬ÀĨBÆJ´N¥i¥H¨D±o
x1        x2        f(x1)
ªñ¦ü¸Ñ¡G-3.2360679774998 ,  »~®t­È4.17443857259059E-14               
ªñ¦ü¸Ñ¡G1.23606797749978 , »~®t­È3.73034936274053E-14               
´`Àô¦¸¼Æ¡G20612               
­pºâ®É¶¡¡G0.156               


Function f(x)
    f = x ^ 2 + 2 * x - 4
End Function
Sub ¤@¤¸¤èµ{¦¡¼É¤O¸Ñªk_ML089()
    Dim r, c1, c2, n, x, x2, s, ss, ct, tm
    tm = Timer
    '[A:C].Clear
    Sheets.Add.Name = Format(Now(), "dd_hhmmss")
    x = -10000: x2 = 10000 '¬d¸ß°Ï¶¡
    s = 1: ss = 100        'Step ªì©l­È¤Î²Ó¤À°£¼Æ
   
    r = 3: c1 = 1: c2 = 2 'cells ¦ì¸m
    Cells(r, c1).Resize(, 3) = Array("x1", "x2", "f(x1)")
    While x <= x2
        ct = ct + 1
        If Application.Median(f(x), 0, f(x + s)) = 0 Then
            r = r + 1
            Cells(r, c1).Resize(, 3) = Array(x, x + s, f(x)) 'Debug ¥Î
            If Round(f(x), 12) = 0 Then
                r = r + 1
                Cells(r, c1) = "ªñ¦ü¸Ñ¡G" & x & " , " & f(x)
                x = x + s
                s = 1
            Else
                s = s / ss
            End If
        Else
            x = x + s
        End If
    Wend
    Cells(r + 1, c1) = "´`Àô¦¸¼Æ¡G" & ct
    Cells(r + 2, c1) = "­pºâ®É¶¡¡G" & Format(Timer - tm, "0.000")
End Sub
{...} ªí¥Ü»Ý­n¥Î CTRL+SHIFT+ENTER ¤TÁä¿é¤J¤½¦¡

TOP

¥»©«³Ì«á¥Ñ ML089 ©ó 2021-10-23 16:50 ½s¿è

¦b¸É¥R¤@¤U¼Ó¤Wªºµ{¦¡·§©À
¢¯¢°¡@¥Ñ -10000 ¦Ü 10000 STEP s
¢¯¢±¡@¡@·í f(x)¡Bf(x + s)ªº­È¦b 0 ªº¥ª¥k¤§®É
¢¯¢²¡@¡@¡@Àˬd¤p¼Æ12¦ì¼Æ¥H¤º¬O§_¬° 0¡A
¡@¡@¡@¡@¡@¡@¬O¡G´N¬Oªñ¦ü¸Ñ¤§¤@¡A­«·s³] s=1«á¦A­«·s¢¯¢±¬d¸ß¤U¤@­Óªñ¦ü¸Ñ
¡@¡@¡@¡@¡@¡@§_¡G³] s = s/100¡A¦A­«·s¢¯¢±¨BÆJ

x1        x2        f(x1)
-4        -3        4¡@(²Ä¢°¦¸¢¯¦b¢î(-4)»Pf(-3)¤§¶¡¡As=1)
-3.24        -3.23        0.0176¡@(²Ä2¦¸¢¯¦b¢î(-3.24)»Pf(-3.23)¤§¶¡¡As=1/100)
-3.2361        -3.236        0.00014321¡@(²Ä3¦¸¢¯¦b¢î(-3.2361)»Pf(-3.231)¤§¶¡¡As=1/10000)
-3.236068        -3.236067        1.00624E-07
-3.23606798        -3.23606797        1.11813E-08
-3.236067978        -3.236067977        9.56568E-13
-3.236067978        -3.236067977        9.56568E-13
-3.236067977        -3.236067977        4.17444E-14
ªñ¦ü¸Ñ¡G-3.2360679774998 , 4.17443857259059E-14               
0.763932023        1.763932023        -1.88854382
1.233932023        1.243932023        -0.009547719
1.236032023        1.236132023        -0.000160794
1.236067023        1.236068023        -4.27089E-06
1.236067973        1.236067983        -2.23588E-08
1.236067977        1.236067978        -4.45365E-10
1.236067977        1.236067978        -2.5846E-12
1.236067977        1.236067977        -3.73035E-14
ªñ¦ü¸Ñ¡G1.23606797749978 , -3.73034936274053E-14               
´`Àô¦¸¼Æ¡G20612               
­pºâ®É¶¡¡G0.168
{...} ªí¥Ü»Ý­n¥Î CTRL+SHIFT+ENTER ¤TÁä¿é¤J¤½¦¡

TOP

¦^´_ 7# Andy2483

¤g¤ì¨t­pºâ¾÷µ{¦¡¤~·|±ÐFortran
VBA¤]¬O¦b½×¾Â¬Ý§A¤Î¨ä¥L°ª¤âªºµªÃDºCºC¾Ç²ß¨Óªº¡A·PÁ§Aªº¿ãÅDµªÃD¾Ç²ß¤£¤Ö¡C
­«ÂI¬O¦b¬¡¤Æ¦Û¤vªº¸£µ¬ÁקK¦Ñ¦~·ö§b¯g(¤]¤£ª¾¦³¨S¦³®Ä?)
¥­±`¤é³£¦^µª¨ç¼Æ¤½¦¡¡A°²¤é¦³ªÅ¤~¯à½m²ß¤@¨ÇVBA¡A²¦³ºVBA¤]¤£¬O¤Ó¼ô¡C
{...} ªí¥Ü»Ý­n¥Î CTRL+SHIFT+ENTER ¤TÁä¿é¤J¤½¦¡

TOP

¦^´_ 9# Andy2483

¥ÑUSER¿é¤J¤èµ{¦¡¡A¨ã¦³¹ê¥Î©Ê»ù­È¼g±o«Ü¦n¡Aµ{¦¡­pºâ³t«×«Ü§Ö§óºë·Ç¡AÆg¡C
{...} ªí¥Ü»Ý­n¥Î CTRL+SHIFT+ENTER ¤TÁä¿é¤J¤½¦¡

TOP

¥»©«³Ì«á¥Ñ ML089 ©ó 2021-10-26 08:40 ½s¿è

¦^´_ 9# Andy2483
¬P´Á¤é¥hÅSÀç¡A¬P´Á¤@±ß¤W¦^®a¡A¬Ý¨ì§Aªºµ{¦¡¸Ñ¤@¤¸¥|¦¸¡A®M¨ì§Ú­ì¥ýªºµ{¦¡¨S¦³¿ìªk§¹¦¨¸Ñ¥X¡A¤£§¹µ½¦a¤è«Ü¦h¡C
¥»¨ÓÅSÀç¦^¨Ó«Ü²ÖÀ³­n¦­ºÎªº«o¤SºÎ¤£µÛ¡A­«·s­×¥¿¤@¤U­ì¥ýµ{¦¡¡A²×©ó§¹¦¨¥i¥HºÎı¤F¡C
1 ¤j°Ï¶¡ -10000 ~ 10000 ¬d¸ß­n§Ö¡A±N ¬d¸ß Step ¤À¬° ¤j¡B¤¤¡B¤p(¥iÅÜ) ¡Aªì©l s = 100¡A¹J¨ì²Ä¤@¸Ñ«á §ï¬° s = s1 = 0.1¡A·í¸Ñ¦b°Ï¶¡(x ~ x+s)®É¦A²Ó¤À s/ss¡Ass=10³£¥i¥H¡C¥[³t¬d¸ß
   ¸Ñµª§¹4¦¸¸Ñ´N¥i¥H¸õÂ÷°j°é¡A¥[³t¬d¸ß
  ³o¦¸Àu¤Æ­pºâ°j°é¥Ñ 20800¦¸­°¦Ü 500¦¸¥ª¥k
2 ¦³ªñ¦ü¸Ñ®É¡A¦A¥Hf( round(x,12) )Àˬd­×¥¿¬°¯u¹ê¸Ñ¡C
3 Áٯʤ֧Aªº¤Íµ½¤H¾÷¤¶­±¡A³o¬P´Á¦A¨Ó·Q¤@·Q¡C

Function f(x)
    'f = x ^ 2 + 2 * x - 4
    'f = x ^ 4 - 6 * x ^ 3 + x ^ 2 + 2 * x + 24
    f = 2 * x ^ 4 - 4 * x ^ 3 - 3 * x ^ 2 + 7 * x - 2  '¤H¤u¶ñ¤J¤èµ{¦¡
End Function
Sub ¤@¤¸¤èµ{¦¡¼É¤O¸Ñªk_ML089()
    Dim r, c1, c2, n, x, x2, s, s1, ss, ct, tm, xNo, xN
    tm = Timer
    ThisWorkbook.Sheets.Add(After:=Worksheets(1)).Name = Format(Now(), "dd_hhmmss") '
    x1 = -10000: x2 = 10000: x = x1 '¬d¸ß°Ï¶¡
    s = 100: s1 = 0.1: ss = 10:  'Step ªì©l­È¨Ï¥Îs,§ä¸Ñ1°Ï¶¡«á¨Ï¥Îs1¡Ass°Ï¶¡²Ó¤À°£¼Æ
    xNo = 4: xN = 0 '¤@¤¸´X¦¸ : ­p¦¸
   
    r = 3: c1 = 1: c2 = 2 'cells ¦ì¸m
    'Cells(r, c1).Resize(, 3) = Array("x1", "x2", "f(x1)")
    While x <= x2
        'DoEvents '·|¼W¥[­pºâ®É¶¡
        ct = ct + 1 '´`Àô¦¸¼Æ
        If Application.Median(f(x), 0, f(x + s)) = 0 Then '¸Ñµª¬O§_¦bx»Px+s¤§¶¡
            'r = r + 1: Cells(r, c1).Resize(, 3) = Array(x, x + s, f(x)) 'Debug ¥Î
            If Round(f(x), 12) = 0 Then 'ºë«×¤p¼Æ12¦ì¼Æ¬°0®É¬°ªñ¦ü¸Ñ
                xN = xN + 1: r = r + 1
                ANS = "ªñ¦ü¸Ñ¡GX" & xN & " = "
                If f(Round(x, 12)) = 0 Then '¯u¹ê¸Ñ§PÂ_»P­×¥¿
                    x = Round(x, 12)
                    ANS = "¯u¹ê¸Ñ¡GX" & xN & " = "
                End If
                Cells(r, c1) = ANS & x & " ,f(x) = " & f(x)
                If xN = xNo Then GoTo 999 '¸Ñµª§¹¦¨¸õ¥X°j°é
                x = x + s
                s = s1
            Else
                s = s / ss '¥Ø«ex~x+s°Ï¶¡¡As¦A²Ó¤À1/SS­¿
            End If
        Else
            x = x + s
        End If
    Wend
999:
    Cells(r + 1, c1) = "¬d¸ß°Ï¶¡¡G" & x1 & "    " & x2
    Cells(r + 2, c1) = "Step ªì©l­È¤Î²Ó¤À°£¼Æ¡G" & s1 & "    " & ss
    Cells(r + 3, c1) = "´`Àô¦¸¼Æ¡G" & ct
    Cells(r + 4, c1) = "­pºâ®É¶¡¡G" & Format(Timer - tm, "0.000")
End Sub

'¥i¥H§R°£¤é´ú¸Õ¤u§@ªí
Sub Del_Sheet()
    Dim MyBook As Workbook, sh As Worksheet
    Set MyBook = ThisWorkbook
    Application.DisplayAlerts = False  '°±¤î¨t²ÎªºÄµ¥Ü
    For Each sh In MyBook.Sheets
        If sh.Name Like Day(Now()) & "_*" Then sh.Delete '§R°£·í¤é DD_*
    Next
    Application.DisplayAlerts = True   '«ì´_¨t²ÎªºÄµ¥Ü
End Sub
{...} ªí¥Ü»Ý­n¥Î CTRL+SHIFT+ENTER ¤TÁä¿é¤J¤½¦¡

TOP

        ÀR«ä¦Û¦b : «Î¼e¤£¦p¤ß¼e¡C
ªð¦^¦Cªí ¤W¤@¥DÃD