Thanks for your help! that was a complete answer :) Best regards.
On Aug 2, 12:14 am, smichr <[email protected]> wrote: > On Jul 31, 7:08 pm, New2Sympy <[email protected]> wrote: > > > Hi All, > > > I am trying to get the Real root as shown below and keep getting a > > NameError. Any suggestions? > > [cut] > > NameError: global name 'conjugate' is not defined > > When you ask for a numerical solution, the first thing that nsolve > does is evaluate your function and then create a "lambdified" version > of it to pass to the solver. When you evaluate your function it looks > like this: > > >>> 1/(.001+a)**3-6/(.9-a)**3 > > (0.001 + a)**(-3) - 6/(0.9 - a)**3>>> _.evalf() > > 3.0e-6*conjugate(a)/(1.0e-6 + 0.001*a + 0.001*conjugate(a) + > a*conjugate(a))**3 + 14.58*conjugate(a)/(0.81 - 0.9*a - 0.9*conjugate > (a) + a*conjugate(a))**3 + 1.0e-9/(1.0e-6 + 0.001*a + 0.001*conjugate > (a) + a*conjugate(a))**3 - 4.374/(0.81 - 0.9*a - 0.9*conjugate(a) + > a*conjugate(a))**3 + 0.003*conjugate(a)**2/(1.0e-6 + 0.001*a + > 0.001*conjugate(a) + a*conjugate(a))**3 - 16.2*conjugate(a)**2/(0.81 - > 0.9*a - 0.9*conjugate(a) + a*conjugate(a))**3 + conjugate(a)**3/ > (1.0e-6 + 0.001*a + 0.001*conjugate(a) + a*conjugate(a))**3 + > 6.0*conjugate(a)**3/(0.81 - 0.9*a - 0.9*conjugate(a) + a*conjugate(a)) > **3 > > All those conjugates are there because sympy (I imagine) doesn't know > whether a will be real or imaginary, so it's covering all bases. The > problem is, in order to evaluate this, you need sympy but the only > thing that nsolve passes along to the solver is mpmath's module. The > solution is to pass sympy, too. I also like to watch the iteration > process so I set the verbose flag to true: > > >>> nsolve(1/(.001+a)**3-6/(.9-a)**3,a,.3,modules="sympy",verbose=True) > > x: 0.315560066156274077187 > error: 0.25 > x: 0.318099998922522143874 > error: 0.234439933843725911711 > x: 0.31882324267983762464 > error: 0.00253993276624806668673 > x: 0.318830099704768381578 > error: 0.000723243757315480766644 > x: 0.318830113872912139068 > error: 0.00000685702493075693761643 > x: 0.318830113873185857794 > error: 1.4168143757489826177e-8 > x: 0.318830113873185911755 > error: 2.7371872575728692042e-13 > x: 0.318830113873185898265 > error: 5.39615044542560845509e-17 > x: 0.318830113873185905365 > error: 1.34903761135640211377e-17 > x: 0.31883011387318590714 > error: 7.10020074079996919847e-18 > x: 0.318830113873185905587 > error: 1.77506342008979314806e-18 > mpf('0.31883011387318591') > > And there you go! > > Notes: > > 1) If you want to use the sure-fire bisect method, don't forget to > send in two values for the starting point: > > >>> nsolve(1/(.001+a)**3-6/(.9-a)**3,a,(.1,.5),modules="sympy",method="bisect") > > mpf('0.3188301138731859') > > 2) For nasty functions like this an alternative approach would be to > find zeros of the numerator instead of the whole expression, or solve > the problem symbolically and substitute in the values when you are > done: > > >>> num,den = (1/(.001+a)**3-6/(.9-a)**3).as_numer_denom() > >>> nsolve(num,a,.3) # no need for sympy now > > mpf('0.31883011387318584') > > > > or > > >>> var('c1 c2');solve(1/(c1+a)**3-6/(c2-a)**3,a) > > Hmmm...it hangs. (I filed this as issue 1571). But we can use the > numerator tric to make things easier for the solver: > > >>> num = (1/(c1+a)**3-6/(c2-a)**3).as_numer_denom()[0] > >>> ans=solv(num,a) > >>> [t.subs({c1:.001,c2:.9}).evalf(n=4) for t in ans] > > [3.188e-1, 3.216e-2 - 5.706e-1*I, 3.216e-2 + 5.706e-1*I] > > Best regards, and welcome to sympy! > /c --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/sympy?hl=en -~----------~----~----~----~------~----~------~--~---
