Аппроксимация F с использованием закона Гука - PullRequest
0 голосов
/ 10 декабря 2018

Эта проблема есть на бумаге для практического экзамена, и я не могу понять код

Вспомните закон Гука, который гласит, что для данной пружины существует постоянная k такая, что когдапружина находится в равновесии F = kx, где F - сила, тянущая за свободный конец, а x - смещение конца от ее исходного положения.

Предположим, что вы хотите оценить постоянную kдля данной пружины, и что у вас есть два списка Python, силы и смещения, где i-е элементы соответствуют друг другу.Напишите программу на Python, которая:

  1. График зависимости силы по оси Y и смещения по оси X.

  2. Расчет линейногоаппроксимация F как функция от x и построение аппроксимации.

Пока у меня есть:

import pylab
pylab.plot(displacements, forces, "bo")
pylab.xlabel("Displacement")
pylab.ylabel("Force")
pylab.show()

Для первой части, которую ядумаю, что правильно.

Для второй части у меня есть:

avgF = sum(forces)/len(forces)
avgX = sum(displacements)/len(displacements)
K = avgF/avgX
pylab.plot(displacements,K*displacements)

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

Ответы [ 2 ]

0 голосов
/ 06 августа 2019

Наименьших квадратов подходят

У вас есть N показания, fₙ и dₙ с n = 1,…,N , сила и смещение, и у вас нет k , пружинная постоянная ... Идеальное соотношение - k dₙ = fₙ , но мы знаем, что,из-за неопределенности измерений идеальное соотношение никогда точно не проверяется, и мы имеем ошибку, eₙ = k dₙ - fₙ .Лучшее, что мы можем сделать, - это минимизировать некоторую меру ошибки ...

После упоминания, что другой популярный выбор - минимизировать максимум абсолютного значения ошибки, давайте посмотрим, что происходит, когда мы пытаемсяминимизировать сумму квадратов ошибок (или, с другой точки зрения, длину вектора ошибок в N -мерном пространстве):

    S = sum((k dₙ - fₙ)²) = sum(k²dₙ² - 2 k dₙ fₙ + fₙ²) =
      = k² sum(dₙ²) - 2 k sum(dₙ fₙ) + sum(fₙ²).

В этом выраженииединственная переменная - k , поэтому, чтобы найти минимум, нам просто нужно обнулить производную от S по k .Используя небольшую алгебру

    S' = 2 k sum(dₙ²) - 2 sum(dₙ fₙ) =0 ⇒ k = sum(dₙ fₙ)/sum(dₙ²)

(помните, что k - не постоянная пружины, а наша лучшая оценка постоянной пружины).

В Python

f, d = [...], [...]
...
k = sum(dn*fn for dn,fn in zip(d,f) / sum(dn**2 for dn in d)
0 голосов
/ 10 декабря 2018

Да, я думаю, что ваш код в порядке.Вы всегда можете сгенерировать случайные выборочные данные и проверить их:

import matplotlib.pyplot as plt
import numpy as np

# Generate random sample data
N = 20
k_theoretical = 3
displacement = np.arange(N)
force = k_theoretical * displacement + np.random.normal(size=N)

# Calculate constant for Hooke's law
avgF = sum(force) / len(force)
avgX = sum(displacement) / len(displacement)
k_calculated = avgF / avgX

# Plot data points and line
plt.plot(displacement, force, "bx")
plt.plot(displacement, k_calculated * displacement, "r-",
    label="k = {:.2f}".format(k_calculated))
plt.xlabel("Displacement")
plt.ylabel("Force")
plt.legend()
plt.show()

graph

Кстати, если вы используете массивы NumPy для своих данныхВы можете рассчитать среднее значение с помощью

avgF = force.mean()
avgX = displacement.mean()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...