Найти - Пользователи
Полная версия: Построение графика в matplotlib. Аппроксимация. Интерполяция. Scipy
Начало » Центр помощи » Построение графика в matplotlib. Аппроксимация. Интерполяция. Scipy
1 2 3
excander
4kpt
Википедия, как я вижу, рулит. Другой литературы не нашлось
Лень было формулировать эту простую мысль своими словами, если это уже сделано, да так красиво)
4kpt
1. Просто провести аппроксимацию, получить полином;
2. Подобрать коэффициенты так, чтобы решение четко проходило через заданные точки.
3. Построить график полученного полинома.
Как это делается в питоне, не подскажите?) теоретически, я это знаю. мне интересна чисто реализация. это не мат-фетиш, я просто учусь) и я сразу дал понять, что “ценность низкая”, и нужно просто сгладить функцию, чтобы она выглядела по-человечески, а не как кусочно-линейная)
4kpt
У меня уже пол третьего ночи. Напишу завтра вечером (если никто раньше не напишет). Только я бы хотел уточнить. Чтобы “четко пройдет через заданные точки” необходимо будет изменять “некоторые заданные точки”. Задача будет сводиться к уменьшения точек, которые придеться изменять через подбор полинома.

И еще…
excander
если это уже сделано, да так красиво)
Это не то, что некрасиво - это ужасно. То что и в том и в другом случае осуществляется приближение многочленами еще не говорит, что эти задачи идентичные. Для их решения используются различные методы и подходы. Это как сказать, что задача линейного программирования - это задача нелинейного программирования, только целевая функция и система ограничений носит линейный характер… :)
excander
4kpt
Это не то, что некрасиво - это ужасно.
согласен, интерполяция - это не разновидность аппроксимации. и вообще я удалил эту часть коммента #9, перед тем как Вы ответили на него
excander
То, что мне нужно, получилось с помощью Cubic-spline interpolation (см вложение):
import numpy as np
import pylab as pl
from scipy import interpolate
S = np.array([2, 4, 8, 10, 20, 50, 70, 100, 150, 200, 300, 400, 500],dtype=float)
Rh = np.array([90, 45, 22.5, 18, 9, 3.60, 2.57, 1.8, 1.2, 0.9, 0.6, 0.45, 0.36],dtype=float)
tck = interpolate.splrep(S,Rh,s=0)
xnew = np.linspace(2,500,10000)
ynew = interpolate.splev(xnew,tck,der=0)
pl.plot(xnew,ynew,S,Rh,'r')

Но у меня появился 1 вопрос. Как создать xnew, чтобы он состоял из np.linspace(2,30,100) и np.linspace(30,500,100)? или с помощью arange…
4kpt
Пришлось поставить все пакеты…
Разберитесь, что у Вас происходит в этих строчках.
tck = interpolate.splrep(S,Rh,s=0)
xnew = np.linspace(2,500,10000)
ynew = interpolate.splev(xnew,tck,der=0)
excander
4kpt, зачем? Я достаточно хорошо представляю, что в них происходит… тут никаких проблем..
4kpt
Тогда зачем дополнительные вопросы?
Если Вам все понятно, тогода строка
excander
Но у меня появился 1 вопрос. Как создать xnew, чтобы он состоял из np.linspace(2,30,100) и np.linspace(30,500,100)? или с помощью arange…
не имеет смысла…
excander
Я абсолютно прозрачно понимаю, что и как и для чего. я не понимаю, как создать объект ndarray с разным шагом на разных отрезках!!! мне это необходимо, потому что мой график имеет гиперболический вид (прикреплял рисунок), и нет смысла делать разбивку отрезка, c одинаковым по длине шагом на
[2;30]
и на
[30,500]
! смысл понимаете?
например, надо получить:
xnew = [2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,100,170,240,310,380,450,520]
4kpt
Был непонятен вопрос.
Самый простой способ - использовать .array() и range().
excander
Хорошо, как это сделать “питонически” хотя бы с “.array() и range()”?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB