Вычислите производные использующие дискретные методы

Вы можете определить свой массив в ваших controller/component файлах и использовать это property в hbs. скажем

app/controllers/application.js

import Controller from '@ember/controller';
import { A } from '@ember/array';

export default Controller.extend({
  status: A(['success', 'warning', 'error', 'info']),
})

в вашем app / templates / application.hbs

{{#each status as |type|}}
  {{type}}
{{/each}}

Вы можете взглянуть на функцию собственного массива ember.

10
задан Bill the Lizard 18 September 2012 в 17:05
поделиться

10 ответов

Существует довольно мало теории (и установленная практика) в вычислении числовых ("конечных") производных. Получение всех подробностей, корректных, таких, что Вы верите результату, не тривиально. Если существует какой-либо способ, которым можно получить аналитическую производную функции (использование пера и бумаги или компьютерной системы алгебры, такой как Клен, Mathematica, Мудрец или SymPy), это - безусловно наилучший вариант.

Если Вы не можете получить аналитическую форму, или Вы не знаете функции (просто, она производится), то числовая оценка является Вашей единственной опцией. Эта глава в Числовом Recipies в C является хорошим началом.

7
ответ дан 3 December 2019 в 15:36
поделиться

Я думаю, что Вы ищете производную, вычисленную в точке. Если это верно, здесь существует простой способ сделать это. Необходимо знать производную в точке, сказать a. Это дано пределом отношения приращений для h-> 0:

difference quotient

На самом деле необходимо реализовать предельную функцию. Так Вы:

  • Определите эпсилон, установите его более маленький, чтобы быть более точными, больше, чтобы быть быстрее
  • вычислите отношение приращений в запуске h, предположите h=0.01, сохраните его в f1
  • Теперь в ЦИКЛЕ С УСЛОВИЕМ ПРОДОЛЖЕНИЯ:

    1-делят в на 2 (или 10, важная вещь состоит в том, чтобы сделать его меньшим),
    2-вычисляют снова отношение приращений с новым значением h, хранят это в f2
    3-разностей набора = брюшной пресс (f2-f1)
    4-присваивают f1 = f2
    5-повторений от точки 1, в то время как (разность> эпсилон)

  • Можно наконец возвратить f1 (или f2) как значение f' (a)

Помните: Вы предполагаете, что функция дифференцируема в a. Каждый результат, который Вы получите, будет неправильно должен из ошибок конечной десятичной цифры, которую может обработать Ваш компьютер, нет никакого побега из этого.

Пример в Python:

def derive(f, a, h=0.01, epsilon = 1e-7):
    f1 = (f(a+h)-f(a))/h
    while True: # DO-WHILE
        h /= 2.
        f2 = (f(a+h)-f(a))/h
        diff = abs(f2-f1)
        f1 = f2
        if diff<epsilon: break
    return f2

print "derivatives in x=0"
print "x^2: \t\t %.6f" % derive(lambda x: x**2,0)
print "x:\t\t %.6f" % derive(lambda x: x,0)
print "(x-1)^2:\t %.6f" % derive(lambda x: (x-1)**2,0)

print "\n\nReal values:"
print derive(lambda x: x**2,0)
print derive(lambda x: x,0)
print derive(lambda x: (x-1)**2,0)

Вывод:

derivatives in x=0
x^2:         0.000000
x:       1.000000
(x-1)^2:     -2.000000


Real values:
7.62939453125e-08
1.0
-1.99999992328

В первый раз, когда я имею "точное" значение" из-за использования только первых 6 цифр результата, отмечаю, я использовал 1e-7 в качестве эпсилона. РЕАЛЬНЫЕ расчетные значения печатаются после этого, и они, очевидно, математически неправы. Выбирание того, как маленький эпсилон, зависит от того, как точный Вы хотите, чтобы Ваши результаты были.

10
ответ дан 3 December 2019 в 15:36
поделиться

Официально, нет. Или Вы описываете (частичный) derivitives дискретных функций, или Вы просите численный метод приблизить (частичные) производные непрерывных функций.

Дискретные функции не имеют производных. При рассмотрении определения дельты эпсилона производной Вы будете видеть, что необходимо было бы смочь оценить функцию близко к точке, в которой Вы хотите производную. Это не имеет смысла, если функция только имеет значения в целочисленных значениях x, y и z. Таким образом, нет никакого способа найти производную дискретной функции для любого значения быстро.

Если Вы хотите численный метод, точно вычисляют производные непрерывной функции, Вам не повезло также. Численные методы для производных являются эвристикой, не алгоритмической. Нет никакого численного метода, который гарантирует точное решение. К счастью, там существуйте много хорошей эвристики. Mathematica использует специализированную версию принципиального метода оси Brent по умолчанию. Я рекомендовал бы использовать GNU Научная Библиотека, которая имеет очень хорошую реализацию метода Brent. Я должен свой весь класс в одном из моих математических курсов к GSL. Рубиновая привязка довольно хороша, если это - Ваша вещь. При необходимости большинство числовых библиотек дифференцирования имеет горстку различных методов в наличии.

Если Вы действительно хотите, я могу выкрикнуть некоторый пример кода.Дайте мне знать.

1
ответ дан 3 December 2019 в 15:36
поделиться

Я предположу, что Ваша функция более сложна, чем простая, которую Вы отправили, потому что решение закрытой формы слишком просто.

При использовании слова, "дискретного", оно заставляет меня думать, что Вам нужны "конечные разности". Вам будет нужна некоторая дискретизация для вычисления приближения.

Df/Dx ~ (f2-f1) / (x2-x1), и т.д.

0
ответ дан 3 December 2019 в 15:36
поделиться

Чтобы сделать числовое дифференцирование, которое всегда является приближением, существует два общих сценария:

  1. У Вас есть путь (алгоритм, уравнение) для вычисления значения f (x) в любом данном x, или
  2. У Вас есть значение f (x) в ряде равномерно распределенных значений x (f (1), f (1.5), f (2) и т.д.):


  1. Если у Вас есть алгоритм, то Вы являетесь выглядящими лучше всего в answer* Andrea Ambu:
    1. Запустите со значений f (a+h) и f (a-h) и сделайте
      f' (a) = {f (a+h)-f (a-h)} / 2 ч
      Это известно как центральное различие.
    2. Уменьшите размер смещения h, пока f' (a) не прекратит изменяться, согласно ответу Andrea.
    • Будьте осторожны, который Вы не делите на 2 ч, не проверяя, что это больше, чем 0, или Вы доберетесь, делятся на нулевые ошибки.
  2. Если у Вас есть значение функции во множестве значений f (x) = f (xn) = fn, то мы можем сделать что-то подобное вышеупомянутому методу, но наша точность будет ограничена значениями xn и разрывов между ними.
  3. Первое приближение должно только использовать тот же центральный оператор различия как выше;
    f'n = (fn+1 - fn-1)/2h,
    где h является равным интервалом между значениями xn.
  4. Следующее должно использовать шаблон с пятью точками, хотя он имеет только 4 коэффициента, как детализировано на той странице Википедии. Это использует значения от fn-2 до fn+2: f'n = (-fn+2 + 8fn+1 - 8fn-1 +fn-2) / 12-й.
  5. существуют приближения высшего порядка с помощью большего количества точек, но они становятся все больше трудными вычислить для убывающей доходности и стать более нестабильными численно.
  6. ** Отметьте **: Эти формулы конечной разности полагаются на f, являющийся приблизительно той же формой как многочлен в диапазоне xn-1 ≤ x ≤n+1. Для функций как синусоидальные волны они могут быть довольно плохими при вычислении производной к хорошей степени точности.

* ответ Andrea использует оператор правой разности {f (a+h) - f (a)}/h вместо центрального оператора различия {f (a+h) - f (a-h)}/2h, но оператор правой разности менее точен в числовых решениях.

3
ответ дан 3 December 2019 в 15:36
поделиться

Простой метод состоит в том, чтобы вычислить изменение в f по маленькому значению для каждой точки производной, которой Вы интересуетесь. Например, для вычислений ∂f / ∂ x Вы могли использовать это:

epsilon = 1e-8
∂f/∂x(x, y, z) = (f(x+epsilon,y,z) - f(x-epsilon, y, z))/(epsilon * 2);

Другой partials был бы подобен в y и z.

Значение, выбранное для эпсилона, зависит от содержания f, требуемая точность, тип с плавающей точкой, используемый, и вероятно другие вещи. Я предлагаю, чтобы Вы экспериментировали со значениями для него с функциями, которыми Вы интересуетесь.

4
ответ дан 3 December 2019 в 15:36
поделиться

Я надеюсь, что это может быть полезным ЧИСЛОВЫМ ДИФФЕРЕНЦИРОВАНИЕМ.

0
ответ дан 3 December 2019 в 15:36
поделиться

За исключением использования символьного математического языка, как Клен, лучшее, которое можно сделать, должно приблизить производную в различных точках. (И затем интерполируйте при необходимости в функции.)

Если Вы уже получили функцию, Вы хотите использовать, то необходимо использовать обратное разностное отношение forumla и экстраполяцию Richardson для улучшения ошибки.

Также имейте в виду, что эти методы работают над функциями одной переменной. Однако частные производные каждой переменной рассматривают другие переменные как константы.

2
ответ дан 3 December 2019 в 15:36
поделиться

Если функция линейна, поскольку Вы указали затем, что производные тривиальны. Производная относительно 'x' является 'a'; производная относительно 'y' является 'b', и производная относительно 'z' является 'c'. Если уравнение имеет более сложную форму, и Вам нужна формула, представляющая решение, а не эмпирическое решение, то отправьте более сложную форму уравнения.

С уважением

-1
ответ дан 3 December 2019 в 15:36
поделиться

Автоматическая дифференциация - самый точный и концептуально отличный способ делать такие вещи. Чуть посложнее.

2
ответ дан 3 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: