使用 Mathematica 实现插值多项式算法

发布于 2024-12-23 03:14:58 字数 520 浏览 1 评论 0原文

我必须在 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}]; 

我尝试实现几何平均值,但失败了,因为我什至无法计算总和。)

如何正确实现递归? (几何平均值)

I have to implement this algorithm in Mathematica:

Algorithm

My problem is that I don't really understand the Mathematica syntax because there aren't a lot of useful examples out there. What I have done:

(* 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}]; 

(I tried to implement the geometric mean but I failed because I can't even calculate the Sum.)

How can I implement the recursion correctly? (an the geometric mean)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

风和你 2024-12-30 03:14:58

您可以像这样定义一个函数 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

设置值 sxsy 如您上面定义的那样,我们得到:

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

You can define a function P like this :

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

Setting values sx and sy as you defined above we get :

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
梦毁影碎の 2024-12-30 03:14:58

顺便说一句,Mathematica 有一个内置函数InterpolatingPolynomial。假设 pts 是您想要查找多项式的点列表,则 p[x, k] 可以写为

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

对于原始帖子中的示例,您将得到

pts = {{-1, 0}, {0, 2}, {1, 4}, {3, 32}};

p[x, 0] // Simplify
p[x, 1] // Simplify
p[x, 2] // Simplify
p[x, 3] // Simplify

(* output
0
2 (1 + x)
2 (1 + x)
2 + x + x^3
*)

Just as an aside, Mathematica has a built-in function InterpolatingPolynomial. Suppose pts is the list of points for which you want to find the polynomial, then p[x, k] could be written as

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

For the example in the original post you would get

pts = {{-1, 0}, {0, 2}, {1, 4}, {3, 32}};

p[x, 0] // Simplify
p[x, 1] // Simplify
p[x, 2] // Simplify
p[x, 3] // Simplify

(* output
0
2 (1 + x)
2 (1 + x)
2 + x + x^3
*)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文