我正在解决一个家庭作业问题,我应该为此创建一个函数,为 n+1 个插值点插值 sin(x) 并将插值与这些点处的 sin 实际值进行比较。问题陈述要求一个函数 Lagrangian(x,points) 来完成此任务,尽管我当前执行它的尝试在循环中没有使用“x”和“points”,所以我想我必须再试一次(特别是因为我的代码不能按原样工作!)但是,为什么我无法使用索引访问 x_n 数组中的项目,例如 x_n[k]?此外,有没有办法只访问点数组中的“x”值并循环遍历 L_x 的值?最后,我认为我的“错误”定义是错误的,因为它也应该是一个值数组。是否有必要再创建一个 for 循环来将“error”数组中的每个值与“max_error”进行比较?这是我现在的代码(我们正在教授制作的 GUI 中执行,所以我认为某些命令是独一无二的,例如 messages.write()):
def problem_6_run(problem_6_n, problem_6_m, plot, messages, **kwargs):
n = problem_6_n.value
m = problem_6_m.value
messages.write('\n=== PROBLEM 6 ==========================\n')
x_n = np.linspace(0,2*math.pi,n+1)
y_n = np.sin(x_n)
points = np.column_stack((x_n,y_n))
i = 0
k = 1
L_x = 1.0
def Lagrange(x, points):
for i in n+1:
for k in n+1:
return L_x = (x- x_n[k] / x_n[i] - x_n[k])
return Lagrange = y_n[i] * L_x
error = np.sin(x) - Lagrange
max_error = 0
if error > max_error:
max_error = error
print.messages('Maximum error = &g' % max_error)
plot.draw_lines(n+1,np.sin(x))
plot.draw_points(m,Lagrange)
plots.draw_points(m,error)
编辑:
是的,ThiefMaster 提到的不同事情是我(非 CS)教授环境的一部分;是的,voithos,我正在使用 numpy,并且在这一点上我对 Matlab 的练习肯定比 Python 多(我想这是显而易见的!)。 n和m是用户在GUI中输入的值; n+1 是插值点的数量,m 是稍后绘制的点的数量。
伪代码: 给定 n 和 m
生成 x_n 一个由 0 到 2*pi 之间的 n 个均匀间隔点组成的列表 生成 y_n 对应的 sin(x_n) 点列表
定义点,一个由这些有序对组成的二维数组
定义拉格朗日,x 和点的函数
对于 n+1 范围内的每个值(这是我想使用点但不知道如何正确访问这些值的地方)
计算 y_n * (x - x_n[后来的索引]/x_n[先前的索引] - x_n[后来的索引])
计算最大误差 计算误差插值拉格朗日 - sin(x)
绘制正弦(x);绘制拉格朗日图;绘图错误
这有意义吗?
最佳答案
一些建议:
- 您可以通过
x_n[k]
访问x_n
中的项目(以回答您的问题)。 - 您的循环
for i in n+1:
和for k in n+1:
每个循环仅执行一次,其中i=n +1
和一个k=n+1
。您需要使用for i in range(n+1)
(或xrange
)来获取整个值列表[0,1,2,.. .,n]
. - 在
error = np.sin(x) - Lagrange
中:您尚未在任何地方定义x
,因此这可能会导致错误。您的意思是在拉格朗日函数内吗?此外,您还需要从数字np.sin(x)
中减去函数 (拉格朗日
),这不会有好的结果. - 当您在
def Lagrange
中使用return
语句时,您将退出函数。所以你的循环永远不会循环超过一次,因为你正在从函数中返回。我认为您可能实际上想要存储这些值而不是返回它们。
你能写一些伪代码来展示你想要做什么吗?例如:
Given a set of points `xs` and "interpolated" points `ys`:
For each point (x,y) in (xs,ys):
Calculate `sin(x)`
Calculate `sin(x)-y` being the difference between the function and y
.... etc etc
这将使您更容易编写实际代码,并且我们更容易为您提供帮助(特别是如果您在智力上理解您要做什么,唯一的问题是将其转换为 python)。
所以:尝试修复代码中的一些问题,并尝试编写一些伪代码来说明您想要做什么,我们将继续为您提供帮助:)
关于python - 使用 Python 对 sin(x) 进行插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8935478/