Манипуляция списками в Mathematica, относящаяся к интерполяционным полиномам Лагранжа в Mathematica - PullRequest
1 голос
/ 07 декабря 2011

Я пытаюсь использовать список, который передается в функцию таким образом, что я могу

  • получить длину этого списка
  • получить отдельные x и yзначения для манипулирования

Список, которым я пытаюсь манипулировать, можно увидеть ниже:

dataTan = Table[{x, Tan[x]}, {x, -1.5, 1.5, .75}];

Этот вопрос является своего рода продолжением вопроса, замеченного здесь .В конце концов я хочу написать свою собственную функцию в mathematica, которая генерирует полином Лагранжа для интерполяции для заданного набора точек

 {{x0, y0}, ... , {xn, yn}}

Мне нужен какой-то способ доступа к точкам выше, чтобы я мог использовать код ниже:

Sum[Subscript[y, j]*Product[If[j != m, (x - Subscript[x, m])/
       (Subscript[x, j] - Subscript[x, m]), 1], {m, 0, k}], {j, 0, k}]

Ответы [ 2 ]

4 голосов
/ 07 декабря 2011

Учитывая ваш последний вопрос , я предполагаю, что вы имеете в виду полином Лагранжа , поэтому

LagrangePoly[pts_?MatrixQ, var_: x] /; MatchQ[Dimensions[pts], {_, 2}] := 
   With[{k = Length[pts]}, Sum[pts[[j, 2]] Product[
     If[j != m, (var - pts[[m, 1]])/(pts[[j, 1]] - pts[[m, 1]]), 1], 
     {m, 1, k}], {j, 1, k}]]

Мы можем проверить это по касательной функции,

In[2]:= points = Table[{x, Tan[x]}, {x, -1.2, 1.2, .2}]
Out[2]= {{-1.2, -2.57215}, {-1., -1.55741}, {-0.8, -1.02964}, 
         {-0.6, -0.684137}, {-0.4, -0.422793}, {-0.2, -0.20271}, 
         {0., 0.}, {0.2, 0.20271}, {0.4, 0.422793}, 
         {0.6, 0.684137}, {0.8, 1.02964}, {1., 1.55741}, {1.2, 2.57215}}

In[3]:= Plot[Evaluate[Expand[LagrangePoly[points, x]]], {x, -1.2, 1.2}, 
     Epilog -> Point[points]]

tan

В этом случае интерполяция хорошая, максимальное отклонение от исходной функции составляет

In[4]:= FindMaximum[{Abs[Tan[x] - LagrangePoly[points, x]], -1.2<x<1.2}, x]   
Out[4]= {0.000184412, {x -> 0.936711}}

Также обратите внимание, что интерполирующие полиномы фактически встроены в Mathematica:

In[5]:= InterpolatingPolynomial[points, x]-LagrangePoly[points, x]//Expand//Chop
Out[5]= 0

Мне пришлось расширить их оба перед сравнением, поскольку InterpolatingPolynomial возвращает результат в эффективном HornerForm, а мой LagrangePoly возвращается в очень неэффективной форме.

2 голосов
/ 07 декабря 2011

Если у вас есть список l, вы можете получить длину этого списка, используя First@Dimensions@l. Предполагая, что список имеет форму {{x1,y1},{x2,y2},...}, вы можете получить любое из значений x и y в позиции index, просто используя Part[l,index] или его сокращение l[[index]].

РЕДАКТИРОВАТЬ: Если вы хотите сделать вещи простым способом, вы можете использовать Length@l для длины списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...