Newton-Raphson in Visual Basic 6

  • Thread starter Thread starter Benx
  • Start date Start date
  • Tags Tags
    Visual
Click For Summary

Discussion Overview

The discussion revolves around the implementation of the Newton-Raphson method in Visual Basic 6 for solving equations. Participants are seeking to troubleshoot issues related to the accuracy of results and the correctness of the code, including the function and its derivative.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • Benx seeks help with a Visual Basic 6 program using the Newton-Raphson method, indicating that the program is not functioning correctly.
  • Eus suggests that Benx should provide more details about the specific problems encountered, such as parsing the equation.
  • Participants discuss the need for Benx to share the code to better diagnose the issue.
  • Benx expresses uncertainty about the results compared to those in a reference book and suggests reviewing the function and its derivative.
  • Some participants question the correctness of the derivative function and suggest that it may not be suitable for the Newton-Raphson method in this case.
  • There are discussions about the behavior of the function near the root and the importance of a good initial guess.
  • One participant points out that the function may be multi-valued and has poles, which could complicate the Newton-Raphson method's convergence.
  • Another participant corrects their earlier statement about the derivative and discusses the convergence of the method to a root near zero.
  • There are differing opinions on the correctness of the derivative, with some participants defending their interpretations and others suggesting potential errors.

Areas of Agreement / Disagreement

Participants do not reach a consensus on the correctness of the derivative function or the suitability of the Newton-Raphson method for this problem. Multiple competing views remain regarding the interpretation of the function and its derivative.

Contextual Notes

Participants highlight the need for careful interpretation of the function and its derivative, as well as the potential for singularities affecting the Newton-Raphson method's performance. There are also references to specific parameter values that may influence the results.

Benx
Messages
7
Reaction score
0
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.
 
Technology news on Phys.org
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?


Eus
 
"[URL Benx, today is your lucky day[/URL]
 
Last edited by a moderator:
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.
 
Eus said:
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?


Eus

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".


Benx
 
I think is better to see the code. or the algorithms "function and it's derivative".

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


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


Eus

Ok,
I will attach a vbproject to this message.
 

Attachments

Code:
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
 
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?
 
  • #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
 
  • #11
Newton-Raphson

TheoMcCloskey said:
Hmm. I didn't see anything technically wrong.

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

values are available in procedure Sub NewtonExacte_Click() in form code.
params(0 to 5)

Best regards
Benx
 
  • #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.

...values are available in procedure Sub NewtonExacte_Click() in form code.
params(0 to 5)...

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"
 
  • #13
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!


Eus
 
  • #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.
 
  • #15
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]
?


Eus
 
  • #16
TheoMcCloskey said:
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?

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
 
  • #17
wow ... that's real interesting. Using your values of params

Code:
 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:
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.
 
  • #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.
 

Similar threads

Replies
4
Views
4K
  • · Replies 16 ·
Replies
16
Views
4K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 7 ·
Replies
7
Views
3K
Replies
3
Views
2K
  • · Replies 0 ·
Replies
0
Views
3K
Replies
10
Views
5K
Replies
4
Views
2K
Replies
0
Views
1K