2012-01-20 69 views
1

我正在研究一個家庭作業問題,我應該爲這個插補sin(x)的函數插入n + 1個插值點,並將插值與實際的sin值進行比較那些點。問題陳述要求一個函數拉格朗日算子(x,points)來完成這個,儘管我當前的執行它的嘗試並沒有在循環中使用'x'和'points',所以我認爲我將不得不再次嘗試(特別是)但是,爲什麼我不能使用索引訪問x_n數組中的項目,如x_n [k]?另外,有沒有辦法只訪問points數組中的'x'值並循環那些L_x?最後,我認爲我的'錯誤'定義是錯誤的,因爲它也應該是一組值。是否有必要讓另一個for循環將'error'數組中的每個值與'max_error'進行比較?這是我的代碼,現在(我們在GUI我們的教授做執行,所以我覺得一些命令所獨有的,如messages.write()):使用Python插值sin(x)

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

從0至2 * PI 生成x_n的n個均勻間隔的點的列表生成y_n點爲罪(x_n)的相應列表

定義點, 2D陣列由這些有序對

定義拉格朗日,x的在範圍n + 1中的每個值的函數和點

(這是我想用點,但不知道如何訪問這些適當值)

評估y_n *(X - x_n [之後的索引]/x_n [之前的索引] - x_n [之後的索引])

計算最大誤差 計算錯誤插值Lagrange - sin(x)

plot sin(x);繪製拉格朗日;劇情錯誤

這有道理嗎?

+0

你爲什麼接受任意* kwargs *在你的方法中,如果你不使用它們?爲什麼不直接調用前兩個參數'n'和'm'?或者是你正在工作的環境造成的一項要求?由教授編寫的應用程序(特別是當他們不是CS教授時)往往會做一些奇怪的事情:p – ThiefMaster

+1

看起來你正在使用numpy。另外,這是無效的Python;你可以在多個地方引用你的'Lagrange'函數,但除非你添加parens'()',否則它不會被評估。另外,你的函數從兩個地方返回,併爲它自己的引用賦值。這幾乎看起來像用Python-esque語法編寫的Matlab。 – voithos

回答

1

幾點建議:

  • 您可以通過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]
  • in error = np.sin(x) - Lagrange:您還沒有在任何地方定義x,所以這可能會導致錯誤。你的意思是這個在Lagrange函數中嗎?此外,你從np.sin(x)減去函數Lagrange),這將不會很好結束。
  • 當您在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)。

所以:嘗試修復了一些點在你的代碼,並嘗試寫一些僞說你想要做什麼,我們會繼續幫助你:)

相關問題