Реализовать интерполяционный полиномиальный алгоритм с помощью Mathematica - PullRequest
3 голосов
/ 27 декабря 2011

Я должен реализовать этот алгоритм в Mathematica:

Algorithm

Моя проблема в том, что я не совсем понимаю синтаксис Mathematica, потому что не так много полезных примеров. Что я сделал:

(* Input: 4 Points*)
Array[sx, 4, 0];
Array[sy, 4, 0];

sx[0] = -1; 
sy[0] = 0;

sx[1] = 0;
sy[1] = 2;

sx[2] = 1;
sy[2] = 4;

sx[3] = 3;
sy[3] = 32;


P[x,0]:=sy[0];

P[x, k_] := 
  P[x, k - 1] + (sy[k] - P[sx[k], k - 1])*
    Sum[(x - sx[j])/sx[k] - sx[j], {j, 0, x}]; 

(Я пытался реализовать среднее геометрическое, но потерпел неудачу, потому что не могу даже вычислить сумму.)

Как правильно реализовать рекурсию? (среднее геометрическое)

Ответы [ 2 ]

3 голосов
/ 27 декабря 2011

Так же, как в стороне, Mathematica имеет встроенную функцию InterpolatingPolynomial.Предположим, pts - это список точек, для которых вы хотите найти многочлен, тогда p[x, k] можно записать как

p[x_, k_] := InterpolatingPolynomial[pts[[;;k+1]] ,x]

. Например, в исходном сообщении вы получите

* 1008.*
3 голосов
/ 27 декабря 2011

Вы можете определить функцию P следующим образом:

P[x_, 0]  := sy[0] 
P[x_, k_] := P[x, k - 1] + (sy[k] - P[sx[k], k - 1])*
             Product[(x - sx[j])/(sx[k] - sx[j]), {j, 0, k - 1}] // Simplify

Установив значения sx и sy, как вы определили выше, мы получим:

In[13]:= P[x, 1] 
Out[13]= 2 (1 + x)

In[14]:= P[x, 2]
Out[14]= 2 (1 + x)

In[15]:= P[x, 3]
Out[15]= 2 + x + x^3
...