This thread seems to have gone quiet, but for what it's worth:
Stefan Baumann had said - see below - that he had not found a way to
avoid loops in deriving the coefficients. I showed on 15/9 one way to
derive
the matrix described at
https://en.wikipedia.org/wiki/Newton_polynomial#Main_idea
Here's an implementation of the other approach, described at
https://en.wikipedia.org/wiki/Newton_polynomial#Application
It uses power, ^: , which I suppose is a kind of loop, so perhaps
doesn't quite
fit the bill! ... and it's not fully tacit.
coeffs =: 4 : '{."1 }:@((x&(-/@([ }."0 1~ 1 _1 * >:@-&#)) %~ 2 -~/\
]) ^:a:) y'
Using his example,
x coeffs y
_14.10142 17.559765 _10.878424 4.8348551 0
cf this tacitised version of what I sent earlier:
mat2coeffs =: (%.(1 ,. }:"1@(*/\"1)@(-/~ * +/\@=@i.@#)))~
x mat2coeffs y
_14.10142 17.559765 _10.878424 4.8348551 0
It might be worth pointing out that this section of code, (-/~ *
+/\@=@i.@#) ,
does the main work, setting up an initial matrix:
(-/~ * +/\@=@i.@#) x NB. fixed font looks ok as sent!
0 0 0 0 0
3r4 0 0 0 0
3r2 3r4 0 0 0
9r4 3r2 3r4 0 0
3 9r4 3r2 3r4 0
There's probably a neater way to achieve this....
Cheers,
Mike
On 15/10/2020 19:21, 'Michael Day' via Programming wrote:
It took me a while to see what was required using the matrix, M and
the derived coefficients, a.
But this works ok. I haven't turned the explicit code into a
function, but that should be quite
straightforward.
NB. fixed point font best past here....
a =. y %. M =. 1,. }:"1 */\"1 (-/~ * +/\@:=@i.@#) x
M
1 0 0 0 0
1 3r4 0 0 0
1 3r2 9r8 0 0
1 9r4 27r8 81r32 0
1 3 27r4 81r8 243r32
a
_14.10142 17.559765 _10.878424 4.8348551 0
6{."1 [n =: 1,}:*/\ x-~/steps _1.5 1.5 30 NB. n is Newton basis
form of new x
1 1 1 1 1 1
0 0.1 0.2 0.3 0.4 0.5
0 _0.065 _0.11 _0.135 _0.14 _0.125
0 0.091 0.143 0.162 0.154 0.125
0 _0.19565 _0.29315 _0.3159 _0.2849 _0.21875
plot a +/ . * n
Earlier, I'd overlooked the (rather obvious!) fact that you need to
apply a to the Newton
basis form, n here, of your required prediction points, not the
untransformed points.
Mike
On 15/10/2020 14:50, Stefan Baumann wrote:
Dear all.
Recently I stumbled upon the Newton polynomial and took it as a
practice to
implement it without using loops, but failed. I first didn't get a
grab on
how to create the matrix used in
https://en.wikipedia.org/wiki/Newton_polynomial#Main_idea, and
eventually
came up with code following
https://en.wikipedia.org/wiki/Newton_polynomial#Application:
NB. Newton polynomial
np=: 4 : 0
a=. {. y
for_i. }.>:i.#x do.
y=. (2 (-~)/\ y) % i ({:-{.)\ x NB. Divided differences
a=. a, {. y NB. Coefficients are the topmost entries
end.
NB. Convert the summands aᵢ(x-x₀)…(x-xᵢ₋₁) of the polynomial
NB. from multiplier-and-roots to coefficients form and add them up
+/@,:/ p."1 (;/a) ,. (<''), }:<\ x
)
x=: _3r2 _3r4 0 3r4 3r2
y=: 3&o. x
load'plot'
load'stats'
plot (];(x np y)&p.) steps _1.5 1.5 30
I also tried replacing the loop with fold F:. but again was not able
to do
so. Anyone out there who can enlighten me?
Many thanks. Stefan.
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
--
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm