Найти - Пользователи
Полная версия: Сплайн
Начало » Python для новичков » Сплайн
1
Maemi
Добрый вечер! У меня возникла скорее математическая проблема. Необходимо построить кубический сплайн по заданным точкам. Пыталась построить, но кривая получается уж совсем кривая), извиняюсь за тавтологию. Видимо проблема с коэффициентами, но я не могу найти ошибку. Буду рада за любую помощь (простите за корявый код, только учусь)
x=[5,7.5,9.9,12.9,13.2,15.1,16.3,16.8]
y=[0.024,0.0437,0.0797,0.171,0.199,0.326,0.846,0.972]
n=len(x)

h=[ x[i]-x[i-1] for i in range(1,n)]
h1=[ x[i+1]-x[i] for i in range (n-1)]

#elements of matrix
a=[h[i] for i in range(1,n-2)]
c=[2.*(h[i]+h[i+1]) for i in range(n-2)]
b=[h[i] for i in range(2,n-1)]
f=[6.*((y[i+1]-y[i])/h[i]-(y[i]-y[i-1])/h[i-1]) for i in range(1,n-1)]

#progonochnye coefficienty
A=[0.]
B=[0.]
for m in range(len(a)):
B.append((f[m]-a[m]*B[-1])/(a[m]*A[-1]+c[m]))
A.append(-1.*b[m]/(A[-1]*a[m]+c[m]))

#koefficienty of splyne
C=[(f[-1]-a[-1]*B[-1])/(c[-1]+a[-1]*A[-1])]
for k in range (2,len(A)+1):
C.insert(0,A[-k]*C[-1]+B[-k])
C.insert(0,0.)
C.append(0.)
k3=[]
k2=[]
k1=[]
for j in range(1,len(C)):
k3.append((C[j]-C[j-1])/h[j-1])
k2.append((0.5*h[j-1]*C[j-1])-((1./6.)*((h[j-1])**2.)*k3[j-1])+((y[j]-y[j-1])/h[j-1]))
#k2.append(h[j-1]*(2.*C1[j]+C1[j-1])/6.+(y[j]-y[j-1])/h[j-1])
k1.append(y[j-1])

#zadanie function
def spline(z,xt,a1,b1,c1,d1):
return a1+b1*(z-xt)+(c1/2.)*((z-xt)**2.)+(d1/6.)*((z-xt)**3.)

#postroenie splyne
x2=[]
y2=[]
for i in range(n-1):
for j in range(11):
x2.append(x[i]+(h[i]/10.)*j)
y2.append(spline(x2[-1],x[i],k1[i],k2[i],C[i],k3[i]))
pylab.plot(x2,y2)
Isem
Когда вы пишете:
h=[ x[i]-x[i-1] for i in range(1,n)]
У вас происходит смещение индексов для разностей h, то есть настоящий h у вас на самом деле переходит в h.
grok
Не по сабжу:
Помню еще на первом курсе, летнюю практику проходил, тема у меня как раз была “Кубические сплайны”, вот только писал я ее на паскале)) Раньше бы узнал про замечательный язык Python, на нём бы все сделал))
Isem
Так никогда не поздно вспомнить молодость с высоты старческого мара… мудрости :)
Maemi
так разностей и должно быть n-1, я потом учитываю, что h на самом деле в h
Isem
В формуле для вычисления коэффициентов f должно быть так:

6*((y[i+1]-y[i])/h[i+1]-(y[i]-y[i-1])/h[i])
Соответственно, пределы цикла нужно тоже изменить (range(1,n-2)) и далее по цепочке смотреть, на что это повлияет.

Смотрите, чтобы размерность f была равна размерности c, а размерность a была равна размерности b. При этом аккуратно следите за началом нумерации этих массивов.
Maemi
размерности с и F, a и b совпадают соответственно, а насчет f сейчас посмотрю
Maemi
Большое спасибо за помощь! Нашла ошибку, вроде теперь сносно строит)
Rumato
а в чём ошибка была-то?))
Maemi
я коэффициенты сплайна, а именно С, неправильно вычисляла, с индексами напутала, там получалось, что я все время C беру, что неверно
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