Установка параметров внутри интегральной с помощью Python (или другой полезный язык)

голоса
0

У меня есть набор данных, в основном с информацией о Р (х) как функция от х, а х сам. Я знаю, что из теории проблемы, что я работаю на формате F (X), которая задается как выражение ниже:

Eq.

По существу, я хочу использовать этот набор данных для нахождения параметров а и Ь. Моя проблема заключается в: Как я могу это сделать? Что библиотеки я должен использовать? Я хотел бы ответить с помощью Python. Но R или Джулия будет хорошо, как хорошо.

Из всего , что было сделано до сих пор, я прочитал о называется функциональность , кривой , подобранной из библиотеки SciPy но у меня возникают некоторые проблемы , в какой форме я бы сделать код, пока моя переменная х находится в одном из предела интегрирования ,

Для более эффективных способов работы с этой проблемой, у меня есть следующие ресурсы:

Набор образцов , для которых я знаю параметры я ищу. Для этого набора я знаю , что а = 2 и B = 1 (и с = 3). И прежде , чем он поднимается несколько вопросов о том , как я знаю , что эти параметры: Я знаю , что они , потому что я создал этот образец набор , используя эти параметры из интегрирования уравнения выше всего использовать образец , чтобы исследовать , как я могу их найти и иметь ссылку.

У меня также есть этот набор , для которых единственная информация , которую я имею , что с = 4 и хотите найти и б.

Я хотел бы также отметить, что:

я) сейчас у меня нет кода, чтобы размещать здесь, потому что я понятия не имею, как писать что-то, чтобы решить мою проблему. Но я был бы рад редактировать и обновлять этот вопрос после прочтения какого-либо ответа или помощи, что вы, ребята, могли бы предоставить мне.

б) Я ищу первый для решения которых я не знаю, а и Ь. Но в случае, если это слишком трудно, я был бы рад видеть какое-то решение, где я полагаю, что одна либо или б известно.

Задан 13/01/2020 в 23:59
источник пользователем
На других языках...                            


2 ответов

голоса
0

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

введите описание изображения здесь

Пример численного исчисления ниже производятся с небольшими данными (п = 10) для того, чтобы сделать его легко проверить.

введите описание изображения здесь

Обратите внимание, что регрессия для функции Т (у) которым не точно такой же, как и для у (х), когда данные разбросаны (Результат такой же, если не разбросом).

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

К ТОМУ ЖЕ :

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

Тем не менее, dispite различных значений (а = 1,881; б = 1,617) по сравнению с (а = 2,346, Ь = -0,361) соответствующие кривой нарисованные ниже, не далеко друг от друга:

Синие кривой: от линейной регрессии (выше методы)

Зеленая кривая: от нелинейной регрессии (Андреа)

введите описание изображения здесь

Ответил 14/01/2020 в 15:25
источник пользователем

голоса
0

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

import numpy as np
from scipy.optimize import curve_fit
import pandas as pd
import matplotlib.pyplot as plt

def integrand(x, a):
    b = 1
    c = 3
    return 1/(a*np.sqrt(b*(1+x)**3 + c*(1+x)**4))

def integral(x, a):
    dx = 0.001
    xx = np.arange(0, x, dx)
    arr = integrand(xx, a)
    return np.trapz(arr, dx=dx, axis=-1)

vec_integral = np.vectorize(integral)

df = pd.read_csv('data-with-known-coef-a2-b1-c3.csv')
x = df.domin.values
y = df.resultados2.values
out_mean, out_var = curve_fit(vec_integral, x, y, p0=[2])

plt.plot(x, y)
plt.plot(x, vec_integral(x, out_mean[0]))
plt.title(f'a = {out_mean[0]:.3f} +- {np.sqrt(out_var[0][0]):.3f}')
plt.show()

vec_integral = np.vectorize(integral)

введите описание изображения здесь

Конечно, вы можете понизить значение dxдля получения желаемой точности. В то время как для установки только a, когда вы пытаетесь пихты , bа также, подгонка не сходится правильно (на мой взгляд , потому что aи bсильно коррелированы). Вот что вы получите:

def integrand(x, a, b):
    c = 3
    return 1/(a*np.sqrt(np.abs(b*(1+x)**3 + c*(1+x)**4)))

def integral(x, a, b):
    dx = 0.001
    xx = np.arange(0, x, dx)
    arr = integrand(xx, a, b)
    return np.trapz(arr, dx=dx, axis=-1)

vec_integral = np.vectorize(integral)

out_mean, out_var = sp.optimize.curve_fit(vec_integral, x, y, p0=[2,3])
plt.title(f'a = {out_mean[0]:.3f} +- {np.sqrt(out_var[0][0]):.3f}\nb = {out_mean[1]:.3f} +- {np.sqrt(out_var[1][1]):.3f}')

plt.plot(x, y, alpha=0.4)
plt.plot(x, vec_integral(x, out_mean[0], out_mean[1]), color='green', label='fitted solution')
plt.plot(x, vec_integral(x, 2, 1),'--', color='red', label='theoretical solution')
plt.legend()
plt.show()

введите описание изображения здесь

Как вы можете видеть, даже если в результате aи bпараметры формирования подгонки «не хорошо», сюжет очень похож.

Ответил 14/01/2020 в 16:24
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more