Notice: On March 31, it was **announced** that Statalist is moving from an email list to a **forum**. The old list will shut down at the end of May, and its replacement, **statalist.org** is already up and running.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

From |
Stas Kolenikov <skolenik@gmail.com> |

To |
statalist@hsphsun2.harvard.edu |

Subject |
Re: st: passing extra information to function evaluator program nl |

Date |
Tue, 23 Mar 2010 11:43:30 -0500 |

You might find it more convenient to use -moremata-'s (kudos to Ben Jann) -mm_root()- or -mm_nrroot()- functions. They don't need any awkward data management; you still need to code your evaluator functions, but you can pass anything to them in a very natural manner. ssc install moremata, repalce mata: real scalar function mypolynom(real scalar x, real vector a) { K = cols(a) f = 0 for(k=1;k<=K;k++) { f = f*x + a[k] } return( f ) } A = (1, -2, -1 \ 2, 5, -4 \ 3, -8 ,-1 ) for(i=1;i<=3;i++) { rc = mm_root( x=., &mypolynom(), 0, 10, 0, 1000, A[i,.]) if (!rc) x } end // of mata Note that -mm_root()- is pretty dumb, and does expect the user to provide smart endpoints of an interval in which the root is known to be located (so that the values of the function are of opposite sign). -mm_nrroot()- is somewhat smarter, but I couldn't make it run, for some reason (Mata version conflict of some kind?) On Tue, Mar 23, 2010 at 11:14 AM, Ben Zipperer <benzipperer@gmail.com> wrote: > I am interested in using Stata to find a real roots to a single > polynomial several times, where the coefficients vary each time. I > basically want to apply Newton's method or something else to vectors > of coefficients. I originally planned to restrict the solver at > http://www.stata.com/support/faqs/lang/nl.html to a single polynomial > and then iterate it, changing the coefficients at each iteration. > However, I can't figure out how to pass the coefficients to the > function evaluator program. How do I do this? Do I modify the syntax > statement of the program? Or should I try a different strategy? > > For example, let's say the rows of the following matrix form the > coefficients for a quadratic polynomial > > mat def M = (1,2,3\ 4,5,6\ 7,8,9) > > Then the nl program evaluator program is something like > > capture program drop nlpolysolve > program nlpolysolve > > syntax varlist(min=1 max=1) [if], at(name) > > tempname x z > scalar `x' = `at'[1, 1] > scalar `z' = `at'[1, 2] > > tempvar yh > // the real polynomial > gen double `yh' = a_`i' * x^2 + b_`i' * `x' + c_`i' + 1 in 1 > > replace `yh' = 1 - `z' in 2 > replace `varlist' = `yh' > > end > > And my iterations are something like > > forvalues i=1/3 { > preserve > clear > set obs 2 > gen y = 0 > replace y = 1 in 1 > > local a_`i' = M[`i',1] > local b_`i' = M[`i',2] > local c_`i' = M[`i',3] > > nl polysolve @ y, parameters(A B) initial(A 0.5 B 1) > stuffiwanttopass(a_`i' b_`i' c_i') > > restore > } > > How do I pass the entries of the matrix to the nlpolysolve program above? > > thanks, > Ben > * > * For searches and help try: > * http://www.stata.com/help.cgi?search > * http://www.stata.com/support/statalist/faq > * http://www.ats.ucla.edu/stat/stata/ > -- Stas Kolenikov, also found at http://stas.kolenikov.name Small print: I use this email account for mailing lists only. * * For searches and help try: * http://www.stata.com/help.cgi?search * http://www.stata.com/support/statalist/faq * http://www.ats.ucla.edu/stat/stata/

**References**:**st: passing extra information to function evaluator program nl***From:*Ben Zipperer <benzipperer@gmail.com>

- Prev by Date:
**Re: st: weight in a field survey** - Next by Date:
**st: -xthtaylor and weights** - Previous by thread:
**st: passing extra information to function evaluator program nl** - Next by thread:
**Re: st: passing extra information to function evaluator program nl** - Index(es):