Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Newton-Raphson in Visual Basic 6

  1. Feb 28, 2008 #1
    Hello,
    I am progamming in Visual Basic 6, need help to resolve equation using Newton-Raphson
    method.
    My program is running, but not properly!

    Thank you.
     
  2. jcsd
  3. Feb 29, 2008 #2

    Eus

    User Avatar

    Hi Ho!

    I think you should specify your problem in detail first before we can help you.
    What kind of problem do you have in resolving the equation? Parsing the equation? Or, what?

    Best regards,
    Eus
     
  4. Mar 1, 2008 #3
  5. Mar 1, 2008 #4
    basePARTICLE - that code is for SECANT method - and, please no offense, but that's some old code ...

    I think what Benx needs right now is exactly what Eus suggested - provide better details of his problem - that way we might be able to offer better help.
     
  6. Mar 2, 2008 #5
    Hello,
    I do not found the same result as example given in the book, i don't know were is the
    failure.
    I think is better to see the code. or the algorithms "function and it's derivative".

    Best regards,
    Benx
     
  7. Mar 2, 2008 #6

    Eus

    User Avatar

    So, why didn't you just post the code?

    Best regards,
    Eus
     
  8. Mar 3, 2008 #7
    Ok,
    I will attach a vbproject to this message.
     

    Attached Files:

  9. Mar 3, 2008 #8

    CRGreathouse

    User Avatar
    Science Advisor
    Homework Helper

    Code (Text):
    Attribute VB_Name = "Module1"
     Public Function NewtonExact(Root As Double, TOL As Double, maxIter As Integer, params() As Double) As Integer

      Dim iter As Integer
      Dim diff As Double


      Do
        diff = MyFxMu(Root, params()) / MyDerivMu(Root, params())
        Root = Root - diff
        iter = iter + 1
      Loop While (iter <= maxIter) And (Abs(diff) > TOL)

      If Abs(diff) <= TOL Then
        NewtonExact = True
      Else
        NewtonExact = False
      End If

    End Function
    Function MyDerivMu(X As Double, params() As Double) As Double
        ' First Derivative f'(µ)
       
        term1 = params(0) / (params(3) - X)
        term2 = params(1) / (params(4) - X)
        term3 = params(2) / (params(5) - X)
           
        MyDerivMu = (2 / (params(3) - X)) * term1 * term1 + (2 / (params(4) - X)) * term2 * term2 + (2 / (params(5) - X)) * term3 * term3
    End Function
    Function MyFxMu(X As Double, params() As Double) As Double
         'Function f(µ)
        term1 = params(0) / (params(3) - X)
        term2 = params(1) / (params(4) - X)
        term3 = params(2) / (params(5) - X)
       
    MyFxMu = (term1 * term1 + term2 * term2 + term3 * term3) - 1
    End Function
     
  10. Mar 4, 2008 #9
    Hmm. I didn't see anything technically wrong.

    Benx, what are the values for the parameters (ie, your array params) ?

    Also, some question to think about:
    1. Have you graphed this out to see the behavoir near the root?
    2. Do you have a reasonably accurate initial quess to root?
    3. Do the iterates ever come close to some of the params values (in which case, we may have trouble due to sinularities?
     
  11. Mar 4, 2008 #10
    Newton-Raphson

    Hello,

    You can see algorithm, available in Text file of project.
    So, I want to know if the algorithm is implemented properly.

    Best regards
    Benx
     
  12. Mar 4, 2008 #11
    Newton-Raphson

     
  13. Mar 5, 2008 #12
    Like I said, I didn't see anything technically wrong.

    I did read the txt file, but the expressions for F and F' are not too clear (looks like the lack of proper use of parens). I can only assume you interpreted the function "F" correctly.

    OK then, as I suggested, plot this function out and you'll see that the root is not where you think it is.

    In fact, this function (as you transcribed) is multi-valued and also has a series of three poles (quess where) and may be very ill-form for a Newton search.

    Are you sure you interpreted the function "F" correctly?

    In fact, your function (as stated) can be manipulated to a search of the zero of a cubic polynomial.

    Thus, give the original problem statement a review and make sure you have the correct interpretation of the function "F"
     
  14. Mar 5, 2008 #13

    Eus

    User Avatar

    Hi Ho!

    Your mistake is in the first derivative of your function.

    If
    [tex]
    F(\mu)=\left ( \frac{b1}{a1-\mu} \right )^2 + \left ( \frac{b2}{a2-\mu} \right )^2 + \left ( \frac{b3}{a3-\mu} \right )^2 - 1
    [/tex]

    Then
    [tex]
    F'(\mu)=2\left ( \frac{b1}{a1-\mu}\right ) \left ( \frac{a1 - \mu + b1}{(a1 - \mu)^2} \right ) + 2\left ( \frac{b2}{a2-\mu}\right ) \left ( \frac{a2 - \mu + b2}{(a2 - \mu)^2} \right ) + 2\left ( \frac{b3}{a3-\mu}\right ) \left ( \frac{a3 - \mu + b3}{(a3 - \mu)^2} \right )
    [/tex]

    Since the quotient rule states:
    [tex]
    \left ( \frac{u}{v} \right )'=\frac{u'\ v - u\ v'}{v^2}
    [/tex]

    If the initial guess is 0.0, the program should find the root, which is at x = 2.566477775, more or less at its 33th iteration.

    Good luck!

    Best regards,
    Eus
     
  15. Mar 6, 2008 #14
    I need to correct myself --<groan> as I analyzed the wrong F. In my computations, I forgot to square the indiviual terms of [itex]b_i / ({a_i-\mu})[/itex]. Sorry for the confusion.

    However, once I correct F, I do see a root near zero (between -.24 and -.22), a large positive pole around 1, and another zero near 2.5 ( this probably being the root Eus discussed).

    But, I don't agree with Eus's derivative. If we have a term such as

    [tex]g(\mu) = \Large(\frac{b_1}{a_1-\mu}\Large)^2[/tex]

    and if I let

    [tex]v(\mu)=a_1-\mu[/tex]

    then

    [tex]g(v(\mu))=\big(\frac{b_1}{v}\big)^2=\Large(b_1v^{-1}\Large)^2=b_1^2 v^{-2}[/tex]

    and

    [tex]\frac{dg}{d\mu} = \frac{dg}{dv}\frac{dv}{d\mu}= -2\,b_1^2\,v^{-3}\,\frac{dv}{d\mu}= -2\,b_1^2\,v^{-3}\,(-1) = 2\Large(\frac{b_1}{v}\Large)^2\frac{1}{v}[/tex]

    Thus, I don't think the derivative is wrong, unless I missing something (which I proved capable of doing many times).

    Again, for the given function F and the given derivative, the procedure does converge in abot 5 iterations to the root near zero ( Root = -0.236799382041445 ) but not to the root stated in the problem statement.
     
  16. Mar 7, 2008 #15

    Eus

    User Avatar

    Hi Ho!

    Isn't that if
    [tex]
    g(\mu)=\left ( \frac{b_{1}}{a_{1}-\mu} \right )^2
    [/tex]
    and
    [tex]
    v(\mu)=a_{1}-\mu
    [/tex]
    then
    [tex]
    g(v(\mu))=\left ( \frac{b_{1}}{a_{1}-v(\mu)} \right )^2
    [/tex]

    [tex]
    g(v(\mu))=\left ( \frac{b_{1}}{a_{1}-(a_{1}-\mu)} \right )^2
    [/tex]

    [tex]
    g(v(\mu))=\left ( \frac{b_{1}}{a_{1}-a_{1}+\mu} \right )^2
    [/tex]

    [tex]
    g(v(\mu))=\left ( \frac{b_{1}}{\mu} \right )^2
    [/tex]
    ?

    Best regards,
    Eus
     
  17. Mar 18, 2008 #16
    Hello,
    There is no error on derivative function!
    Newton-Raphson is not indicated for this case.
    first we compute u_bound an l_bound:

    //Get upper bound on mu
    u_bound1 = a1-fabs(b1);
    u_bound2 = a2-fabs(b2);
    u_bound3 = a3-fabs(b3);
    u_bound = u_bound1;
    if (u_bound2 < u_bound) u_bound=u_bound2;
    if (u_bound3 < u_bound) u_bound=u_bound3;
    l_bound1 = a1-1.73205080757*fabs(b1);

    //get lower bound on mu
    l_bound2 = a2-1.73205080757*fabs(b2);
    l_bound3 = a3-1.73205080757*fabs(b3);
    l_bound = l_bound1;
    if (l_bound2 < l_bound) l_bound = l_bound2;
    if (l_bound3 < l_bound) l_bound = l_bound3;

    Then we use rtsafe algorithm "it's combined Newton-bisection method".
    at the third iteration we found:
    µ=-0.000109354
     
  18. Mar 19, 2008 #17
    wow ... that's real interesting. Using your values of params

    Code (Text):
     params(0) = -0.404279 'b1
      params(1) = -0.767506 'b2
      params(2) = -1.013014 'b3
      params(3) = 0.629811  'a1
      params(4) = 1.000785  'a2
      params(5) = 1.369404  'a3
    and your definition of F(x)

    Code (Text):
    Function MyFxMu(X As Double, params() As Double) As Double
         'Function f(µ)
        term1 = params(0) / (params(3) - X)
        term2 = params(1) / (params(4) - X)
        term3 = params(2) / (params(5) - X)
       
        MyFxMu = (term1 * term1 + term2 * term2 + term3 * term3) - 1
    End Function
    ... I am just not getting your results, either graphically or iteratively. I am getting, as stated before, x aprrox = -.236 both iteratively and graphically.
     
  19. Mar 19, 2008 #18
    µ, is the smallest root of the sixth degree polynomial f(µ).
    The general shape of the graph of this equation shows that the real roots will be
    distributed as follows:
    1 root < a1 < 2 (possible) roots < a2 < 2 (possible) roots < a3 < 1 root.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: Newton-Raphson in Visual Basic 6
Loading...