Consider the following,
(+/@:*:D.1 D.1) 0 0
1 0
0 1
(+/@:*:D.1 D.1) 0 111
0 0
0 1.9861
(+/@:*:D.2 ) 0 0
2 0
0 2
(+/@:*:D.2 ) 0 111
0 _304.804
1.00391 1.99305
As far as I know, the second derivative of the sum of the squares is, in
principle, two times the identity matrix regardless of the arguments. Am I
missing something?
On Sat, Feb 13, 2016 at 4:09 PM, Marshall Lochbaum <[email protected]>
wrote:
> If u is (+/@:*:), then (u D. 1) returns a vector, not a matrix. From
> your first email it looked like you wanted to find a zero of
> (+/@:*: D. 1), that is, minimize (+/@:*:). multinewt works for that
> case:
>
> +/@:*: D. 1 multinewt (<5) 3 4
> 3 4
> _0.142552 _0.0529989
> 0.00158427 0.00128811
> _1.42249e_5 2.08734e_5
> _2.57043e_7 _1.37868e_7
>
> There's a more complicated formula if the function's range has fewer
> dimensions than its domain. For a scalar function of a vector like
> (+/@:*:) it is
>
> v_{n+1} = v_n - f(v_n) * f'(v_n) / |f'(v_n)|^2
>
> or
>
> vsnewt =: 2 : '(- u * [: (% +/@:*:) u D.1)^:n'
>
> +/@:*: vsnewt (<5) 3 4
> 3 4
> 1.5 2
> 0.75 1
> 0.375 0.5
> 0.1875 0.25
>
> This converges slowly because the root has order two.
>
> Marshall
>
> On Sat, Feb 13, 2016 at 09:32:15PM +0100, Louis de Forcrand wrote:
> > I’m sorry about that Raul, that should read “y”.
> >
> > ----
> >
> > Thanks Roger. You were right, after a quick search, I’ve found that
> > indeed I would need to perform a matrix division. Several documents
> > give this as a multi-variable Newton method:
> >
> > v_n+1 = v_n - J_f (v_n) ^-1 f(v_n)
> >
> > In J, this would be:
> >
> > multinewt=: 2 : ‘(- u %. u D.1)^:n’
> >
> > However, if I take a paraboloid z =: +/@:*: x y , and look for its zeros
> with
> >
> > +/@:*: multinewt (<5) 3 4
> >
> > I get this:
> >
> > 3 4
> > _0.5 0.5
> > _0.5 0.5
> > _0.5 0.5
> > _0.5 0.5
> >
> > which is obviously wrong. Would I need some sort of transposition? This
> > could just be due to precision errors. Or because I wrote an erroneous
> > conjunction?
> >
> > Cheers,
> > Louis
> >
> > > On 13 Feb 2016, at 20:52, Raul Miller <[email protected]> wrote:
> > >
> > > Something is wrong here.
> > >
> > > You say "where A is the original argument, or the result of the
> > > previous iteration."
> > >
> > > ... but I can find no use of A in the expression you are describing.
> > >
> > > Can you look over what you wrote and decide if it is what you meant to
> say?
> > >
> > > Thanks,
> > >
> > > --
> > > Raul
> > >
> > > On Sat, Feb 13, 2016 at 10:50 AM, Louis de Forcrand <[email protected]>
> wrote:
> > >> I’ve been trying to write a conjunction that will find the zeros to a
> function using the
> > >> Newton-Raphson method. The simplest way to do this is probably:
> > >>
> > >> English:
> > >> x_n+1 = x_n - f ( x_n ) / f ‘ ( x_n )
> > >>
> > >> J:
> > >> eznewt=: 2 : ‘ ( - u % u D.1 ) ^: n ‘
> > >>
> > >> This works fine for scalar -> scalar functions, but won’t work if the
> rank of the
> > >> result is AND the rank of the arguments are above 1.
> > >> Probably the most evident situation where this would be a problem is
> if one
> > >> were searching for a minimum instead of a zero, in which case the
> algorithm
> > >> would be applied to the derivative of the function: +/@:*: D.1 newt
> 30 ] 3 4
> > >> As I understand it, this would give a result shape at each iteration
> (with a function u) of:
> > >>
> > >> ( $y ) , $ u eznewt 1 y
> > >>
> > >> where A is the original argument, or the result of the previous
> iteration. What we would
> > >> want is a result with shape $y .
> > >>
> > >> First, let’s get some rules clear:
> > >> - the syntax should be: (verb) newt (# of iterations) (argument)
> > >> - the argument can be of any rank
> > >> - the shape of the argument matches the shape of the result at any
> iteration
> > >> - this implies that $ u y matches i. 0 or $ y
> > >>
> > >> The hard part is getting u % u D.1 to have the shape of the argument.
> > >> If y is a vector, and u y is a scalar, then u D.1 y will be a vector,
> and
> > >> u D.1 D.1 y will be a $y by $y matrix. All that is needed then is to
> take
> > >> its diagonal with (<0 1)&|: .
> > >>
> > >> But what if y is a matrix? Since $ u D.1 y -: ( $ y ) , $ u y , I
> though maybe running
> > >> y's axis together with |: might work
> > >>
> > >> newt=: 2 : '(- u diag_and_divide u D.1)^:n’
> > >> diag_and_divide=: [ % ] |:~ -@#@$@[ <@}. i.@#@$@]
> > >>
> > >> but something about it doesn’t.
> > >> My head is $pinning now, and I figured I’d send this and then take a
> break.
> > >>
> > >> Thanks in advance!
> > >> Louis
> > >> ----------------------------------------------------------------------
> > >> For information about J forums see
> http://www.jsoftware.com/forums.htm
> > > ----------------------------------------------------------------------
> > > For information about J forums see http://www.jsoftware.com/forums.htm
> >
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm