Интерполяция sin (x) с использованием Python - PullRequest
1 голос
/ 20 января 2012

Я работаю над проблемой домашней работы, для которой я должен создать функцию, которая интерполирует sin (x) для n + 1 точек интерполяции и сравнивает интерполяцию с фактическими значениями sin в этих точках. В постановке задачи запрашивается функция лагранжиана (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 - это количество точек, с которыми вы будете строить позже.

псевдокод: Дано п и м

Создать x_n список из n равномерно распределенных точек от 0 до 2 * пи Сгенерируйте y_n соответствующий список точек для sin (x_n)

Определение точек, двумерный массив, состоящий из этих упорядоченных пар

Определение Лагранжа, функции х и точек

для каждого значения в диапазоне n + 1 (именно здесь я хотел бы использовать точки, но не знаю, как правильно обращаться к этим значениям)

оценить y_n * (x - x_n [более поздний индекс] / x_n [более ранний индекс] - x_n [более поздний индекс])

Рассчитать максимальную ошибку Вычислить погрешность интерполяции Лагранжа - sin (x)

заговор грех (х); сюжет Лагранжа; ошибка сюжета

Имеет ли это смысл?

1 Ответ

1 голос
/ 20 января 2012

Некоторые предложения:

  • Вы можете получить доступ к элементам в 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 вы выходите из своей функции.Таким образом, ваш цикл никогда не будет повторяться более одного раза, потому что вы возвращаетесь из функции.Я думаю, что вы могли бы на самом деле сохранить эти значения вместо того, чтобы возвращать их.

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

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).

Итак: попробуйте исправить некоторые из этих пунктов в вашем коде и попробуйте написать псевдокод, чтобы сказать, что вы хотите сделать, и мы будем продолжать помогать вам:)

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