Автоматически рассчитать распространение неопределенности: альтернатива регрессии?Python

Программы на Python
Ответить
Anonymous
 Автоматически рассчитать распространение неопределенности: альтернатива регрессии?

Сообщение Anonymous »

Недавно я закончил лабораторную работу по оптике. Я измерил угол падения i1 и угол преломления i2. Я записал эти данные в электронную таблицу и построил график sin⁡i2=fn(sin⁡i1). У меня погрешность 1∘.
В лабораторных инструкциях нам требовалось использовать Regressi, несколько устаревшее программное обеспечение с неинтуитивным интерфейсом (но очень мощное программное обеспечение)
Изображение

[img]https://i. sstatic.net/DbKVcc4E.png[/img]

Два столбца для углов, два для неопределенностей, два для рассчитанных значений синуса и… подождите: два автоматически созданных столбца для неопределенностей в значениях синуса! Это здорово, и насколько мне известно, не существует другого бесплатного программного обеспечения с графическим интерфейсом, которое предлагало бы эту функцию. Всего за несколько кликов я могу определить выражение регрессии (здесь это простое y=a⋅x, но оно может быть и более сложным), и все!
В Python эквивалентная настройка будет выглядеть так:

Код: Выделить всё

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# python -m venv venv
# source venv/bin/activate
# pip install uncertainties numpy matplotlib scipy
import numpy as np
import matplotlib.pyplot as plt
import uncertainties.unumpy as unp
from scipy.optimize import curve_fit

# Initial data (angles of incidence and refraction)
i1 = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80])
i2 = np.array([0, 6.5, 13, 19.5, 25.5, 31, 35.5, 39, 41.5])
σ = 1

# Convert to objects with uncertainties
sin_i1 = unp.sin(unp.radians(unp.uarray(i1, σ)))
sin_i2 = unp.sin(unp.radians(unp.uarray(i2, σ)))

# i₁ in degrees
# i₂ in degrees
# Uncertainty in degrees
# Calculate sin(i₁) with uncertainties
# Calculate sin(i₂) with uncertainties

# Extract nominal values and uncertainties
sin_i1_vals = unp.nominal_values(sin_i1)
# Central values of sin(i₁)
sin_i2_vals = unp.nominal_values(sin_i2)
# Central values of sin(i₂)
sin_i1_err = unp.std_devs(sin_i1)
# Uncertainties of sin(i₁)
sin_i2_err = unp.std_devs(sin_i2)
# Uncertainties of sin(i₂)

# Plot data with error bars
plt.errorbar(sin_i1_vals, sin_i2_vals, xerr=sin_i1_err, yerr=sin_i2_err, fmt=' g', label='Measurements')

# Linear regression model: f(x) = a*x (intercept b = 0)
def linear_model(x, a):
return a * x

# Regression with curve_fit
popt, pcov = curve_fit(linear_model, sin_i1_vals, sin_i2_vals) # pcov: parameter covariance, not used but noted...
a_opt = popt[0] # Regression coefficient

# Plot the regression
plt.plot(sin_i1_vals, linear_model(sin_i1_vals, a_opt), 'tab:blue', label=f"Regression: sin i₂ = {a_opt:.4f} * sin i₁")

# Formatting and display
plt.title('sin i₂ = f(sin i₁)')
plt.xlabel('sin i₁')
plt.ylabel('sin i₂')
plt.xlim([0, 1])
plt.ylim([0, 0.7])
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 0.8, 0.1))
plt.grid(True)
plt.legend()
plt.show()
(кстати, если у вас есть предложения по улучшению этого скрипта Python, я открыт для идей!)
Изображение

Вероятно, это также возможно и в R (о котором я знаю еще меньше чем Python) или Octave.
Но кое-что было у меня на уме уже несколько дней. Похоже, что Regressi в основном используется во Франции, так какое же программное обеспечение используют студенты в других странах для автоматического расчета распространения неопределенности в своих лабораторных работах? Что используют исследователи? (Я предполагаю, что они используют Origin Pro, поскольку их не волнует, если она не бесплатна.)
Итак, я искал альтернативу.
Сначала я попробовал SciDaVis/Alphaplot, который мне очень нравится… но я не смог найти, как автоматически распространять неопределенности. Я могу, конечно, создать столбец для σsin⁡θ=∣cos⁡(θ)∣×σθ вручную, но чтобы найти эту формулу, нужно поработать, и теперь, когда я знаю, что программа делает это автоматически, я не хочу больше делаю это сам!
Затем я попробовал labplot2, Gnuplot, LibreOffice Calc, GeoGebra, Dataplot, JASP, Jamovi. Ни в одном из этих вариантов программного обеспечения я не смог найти эту функцию 🤔???
Я не могу поверить, что Regressi — единственное бесплатное программное обеспечение в мире, которое предлагает автоматическое распространение неопределенности. И если это так, то почему??? Чем пользуются студенты, не являющиеся французами? Почему Регресси не стал более широко известен и не считается важным?
Я, должно быть, что-то упускаю, не могли бы вы мне помочь?

Подробнее здесь: https://stackoverflow.com/questions/791 ... lternative
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»