Bookmark and Share

Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at

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

st: nonlinear equation: finding zeros

From   "Luigi Pinoni" <>
To   <>
Subject   st: nonlinear equation: finding zeros
Date   Fri, 24 Jun 2011 00:19:26 +0200

Dear all, 

I have an apparently simple problem of finding zeros to nonlinear equations.
I was told that mata can easily do the trick but I must say that I am
completely new to it and struggling to enter its programming language. I
have also searched the statalist but either I am left with most of my doubts
or I keep finding reference to the FAQ:, which I am struggling to
implement (so, please, do not redirect me to it again?).

Let me now explain my problem. I need a command to numerically computes the
zeroes of one equation. For instance, consider the single equation:


Assume that (for instance) w=1000 and z=10. Can Stata tell me what is the
value of the scalar R that make the RHS of the equation above equal to zero
(in my example it is R=0.06931471806)?

Actually, all variables mentioned above (w,z) are Nx1 vectors, i.e. w and z
are three variables in a Stata data set and I need to generate the Nx1
vector of solutions, row by row. In other words, the actual problem I have
is to find the N zeros of equations:


Knowing the value of w[i] and z[i], for all i=1,?,N.

I have tried to find this R following the FAQ mentioned above (using mata)
but Stata issues some mistakes that I am unable to interpret. Could you
please tell me where I am going wrong?

I do appreciate your help and please accept my apologies for the naivety of
my mata coding. 

All the best! 

clear all
set obs 10
gen w=.
replace w=915000 in 1
replace w=1000 in 2
replace w=4000 in 3
replace w=250000 in 4
replace w=280000 in 5
replace w=330000 in 6
replace w=500 in 7
replace w=498000 in 8
replace w=410000 in 9
replace w=520000 in 10
gen z=.
replace z=500 in 1
replace z=10 in 2
replace z=1000 in 3
replace z=1000 in 4
replace z=100 in 5
replace z=5000 in 6
replace z=1000 in 7
replace z=5000 in 8
replace z=100 in 9
replace z=2000 in 10

void mysolver(todo, p, lnf, S, H)  {

S = optimize_init()
optimize_init_evaluator(S, &mysolver())
optimize_init_evaluatortype(S, "v0")
optimize_init_params(S, (1))
optimize_init_which(S,  "min" )
optimize_init_conv_ptol(S, 1e-16)
optimize_init_conv_vtol(S, 1e-16)
p = optimize(S)
********** END OF MY EXAMPLE

*   For searches and help try:

© Copyright 1996–2017 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index