我正在研究一个家庭作业问题,我本来应该为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个均匀间隔点的列表 为sin(x_n)生成y_n相应的点列表
定义点,由这些有序对组成的2D数组
定义拉格朗日,x和点的函数
对于n + 1范围内的每个值(这是我想使用点但不知道如何正确访问这些值的地方)
评估y_n *(x - x_n [后期索引] / x_n [早期索引] - x_n [后期索引])
计算最大误差 计算误差插值拉格朗日 - sin(x)
plot sin(x);情节拉格朗日;情节错误
这有意义吗?
答案 0 :(得分:1)
一些建议:
x_n
访问x_n[k]
中的项目(以回答您的问题)。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
,因此可能会导致错误。你的意思是在Lagrange
函数内吗?此外,您要从数字Lagrange
中减去函数(np.sin(x)
),这不会很好。
return
中使用def Lagrange
语句时,您将退出您的职能部门。所以你的循环永远不会循环多次因为你退出了函数。我认为您可能实际上想存储这些值而不是返回它们。你能写一些伪代码来表明你想做什么吗? e.g:
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)。 / p>
所以:尝试在代码中修复其中的一些点,然后尝试编写一些伪代码来说明你想做什么,我们会继续帮助你:)