<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=CubicSpline%2F1002%2FNaCurves.py</id>
	<title>CubicSpline/1002/NaCurves.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=CubicSpline%2F1002%2FNaCurves.py"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=CubicSpline/1002/NaCurves.py&amp;action=history"/>
	<updated>2026-05-15T18:17:34Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=CubicSpline/1002/NaCurves.py&amp;diff=31024&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=CubicSpline/1002/NaCurves.py&amp;diff=31024&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:03Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; from wxPython.wx import *&lt;br /&gt;
 import math&lt;br /&gt;
 import LuDecomposition&lt;br /&gt;
 import  TriDiagonal &lt;br /&gt;
 &lt;br /&gt;
 DATASET = [-1.0, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1.0]&lt;br /&gt;
 &lt;br /&gt;
 def givenFunction(x):&lt;br /&gt;
 	return 1 / (1 + 100 * (x**2))&lt;br /&gt;
 &lt;br /&gt;
 class NormalFunction:&lt;br /&gt;
 	def perform(self, x):&lt;br /&gt;
 		return givenFunction(x)&lt;br /&gt;
 &lt;br /&gt;
 class ErrorLagrange:&lt;br /&gt;
 	def __init__(self, aListX):&lt;br /&gt;
 		self.lagrange = Lagrange(aListX)&lt;br /&gt;
 		self.normalFunc = NormalFunction()&lt;br /&gt;
 &lt;br /&gt;
 	def perform(self, x):&lt;br /&gt;
 		return self.normalFunc.perform(x) - self.lagrange.perform(x)&lt;br /&gt;
 &lt;br /&gt;
 class ErrorPiecewiseLagrange:&lt;br /&gt;
 	def __init__(self, aControlPointListX, aPieceSize):&lt;br /&gt;
 		self.piecewiseLagrange = PiecewiseLagrange(aControlPointListX, aPieceSize)&lt;br /&gt;
 		self.normalFunc = NormalFunction()&lt;br /&gt;
 &lt;br /&gt;
 	def perform(self, x):&lt;br /&gt;
 		return self.normalFunc.perform(x) - self.piecewiseLagrange.perform(x)&lt;br /&gt;
 &lt;br /&gt;
 class ErrorSpline:&lt;br /&gt;
 	def __init__(self, aControlPointListX):&lt;br /&gt;
 		self.spline = Spline(aControlPointListX)&lt;br /&gt;
 		self.normalFunc = NormalFunction()&lt;br /&gt;
 	&lt;br /&gt;
 	def perform(self, x):&lt;br /&gt;
 		return self.normalFunc.perform(x) - self.spline.perform(x)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 class Lagrange:&lt;br /&gt;
 	def __init__(self, aListX):&lt;br /&gt;
 		self.controlPointListX = aListX&lt;br /&gt;
 		self.controlPointListY = self._makeControlPointListY()&lt;br /&gt;
 &lt;br /&gt;
 	def _makeControlPointListY(self):&lt;br /&gt;
 		controlPointListY = []&lt;br /&gt;
 		for x in self.controlPointListX:&lt;br /&gt;
 			controlPointListY.append(givenFunction(x))&lt;br /&gt;
 		return controlPointListY&lt;br /&gt;
 &lt;br /&gt;
 	def getControlPointListX(self):&lt;br /&gt;
 		return self.controlPointListX&lt;br /&gt;
 &lt;br /&gt;
 	def getControlPointListY(self):&lt;br /&gt;
 		return self.controlPointListY&lt;br /&gt;
 &lt;br /&gt;
 	def _basedFunction(self, x, i):&lt;br /&gt;
 		bf = 1&lt;br /&gt;
 		for j in range(0, len(self.controlPointListX)):&lt;br /&gt;
 			bf *= self._subBasedFunction(x, i, j)&lt;br /&gt;
 		return bf &lt;br /&gt;
 &lt;br /&gt;
 	def _subBasedFunction(self, x, i, j):&lt;br /&gt;
 		if i == j:&lt;br /&gt;
 			return 1&lt;br /&gt;
 		else:&lt;br /&gt;
 			return (x - self._getX(j)) / (self._getX(i) - self._getX(j))&lt;br /&gt;
 &lt;br /&gt;
 	def perform(self, x):&lt;br /&gt;
 		lg = 0.0&lt;br /&gt;
 		for i in range(0, len(self.controlPointListX)):&lt;br /&gt;
 			lg += self._basedFunction(x, i) * self._getY(i)&lt;br /&gt;
 &lt;br /&gt;
 		return lg&lt;br /&gt;
 &lt;br /&gt;
 	def _getX(self, i):&lt;br /&gt;
 		return self.controlPointListX[i]&lt;br /&gt;
 &lt;br /&gt;
 	def _getY(self, i):&lt;br /&gt;
 		return self.controlPointListY[i]&lt;br /&gt;
 &lt;br /&gt;
 class PiecewiseLagrange:&lt;br /&gt;
 	def __init__(self, aControlPointListX, aPieceSize):&lt;br /&gt;
 		self.controlPointListX = aControlPointListX&lt;br /&gt;
 		self.pieceSize = aPieceSize&lt;br /&gt;
 &lt;br /&gt;
 	def getControlPointListX(self):&lt;br /&gt;
 		return self.controlPointListX&lt;br /&gt;
 &lt;br /&gt;
 	def perform(self, x):&lt;br /&gt;
 		if (x &amp;amp;gt;= self.controlPointListX[0]) and (x &amp;amp;lt; self.controlPointListX[3]):&lt;br /&gt;
 			return Lagrange(self.getPiece(1)).perform(x)&lt;br /&gt;
 		elif (x &amp;amp;gt;= self.controlPointListX[3]) and (x &amp;amp;lt; self.controlPointListX[6]):&lt;br /&gt;
 			return Lagrange(self.getPiece(2)).perform(x)&lt;br /&gt;
 		elif (x &amp;amp;gt;= self.controlPointListX[6]) and (x &amp;amp;lt; self.controlPointListX[9]):&lt;br /&gt;
 			return Lagrange(self.getPiece(3)).perform(x)&lt;br /&gt;
 		elif (x &amp;amp;gt;= self.controlPointListX[9]) and (x &amp;amp;lt;= self.controlPointListX[10]):&lt;br /&gt;
 			return Lagrange(self.getPiece(4)).perform(x)&lt;br /&gt;
 &lt;br /&gt;
 	def getPiece(self, i):&lt;br /&gt;
 		if ((self.pieceSize-1)*(i-1)+self.pieceSize) &amp;amp;gt; self.getCountControlPoints():&lt;br /&gt;
 			return self.controlPointListX[self.getCountControlPoints()-self.pieceSize : self.getCountControlPoints()]&lt;br /&gt;
 		return self.controlPointListX[self.getFirstPiecePoint(i) : self.getEndPiecePoint(i)]&lt;br /&gt;
 &lt;br /&gt;
 	def getCountControlPoints(self):&lt;br /&gt;
 		return len(self.controlPointListX)&lt;br /&gt;
 &lt;br /&gt;
 	def getFirstPiecePoint(self, i):&lt;br /&gt;
 		return (self.pieceSize-1)*(i-1)&lt;br /&gt;
 &lt;br /&gt;
 	def getEndPiecePoint(self, i):&lt;br /&gt;
 		return (self.pieceSize-1)*(i-1)+self.pieceSize&lt;br /&gt;
 &lt;br /&gt;
 	def getCountPieces(self):&lt;br /&gt;
 		return int(math.ceil( (self.getCountControlPoints()+1) / (self.pieceSize-1) ))&lt;br /&gt;
 &lt;br /&gt;
 class Spline:&lt;br /&gt;
 	def __init__(self, aControlPointListX):&lt;br /&gt;
 		self.controlPointListX = aControlPointListX&lt;br /&gt;
 &lt;br /&gt;
 		self.controlPointListY = self._makeControlPointListY()&lt;br /&gt;
 		self.doublePrimeListY = self._makeDoublePrimeY()&lt;br /&gt;
 &lt;br /&gt;
 	def getAi(self, i):&lt;br /&gt;
 		return (self.getDoublePrimeY(i+1) - self.getDoublePrimeY(i)) / (6 * self.deltaX(i))&lt;br /&gt;
 &lt;br /&gt;
 	def getBi(self, i):&lt;br /&gt;
 		return (self.getDoublePrimeY(i) / 2)&lt;br /&gt;
 &lt;br /&gt;
 	def getCi(self, i):&lt;br /&gt;
 		return (self.deltaY(i) / self.deltaX(i) ) - (self.deltaX(i) / 6) * (self.getDoublePrimeY(i+1) + (2*self.getDoublePrimeY(i)) )&lt;br /&gt;
 &lt;br /&gt;
 	def getDi(self, i):&lt;br /&gt;
 		return self.getYi(i)&lt;br /&gt;
 &lt;br /&gt;
 	def getXi(self, i):&lt;br /&gt;
 		return self.controlPointListX[i]&lt;br /&gt;
 &lt;br /&gt;
 	def getYi(self, i):&lt;br /&gt;
 		return self.controlPointListY[i]&lt;br /&gt;
 &lt;br /&gt;
 	def getDoublePrimeY(self, i):&lt;br /&gt;
 		return self.doublePrimeListY[i][0]&lt;br /&gt;
 &lt;br /&gt;
 	def getControlPointListX(self):&lt;br /&gt;
 		return self.controlPointListX&lt;br /&gt;
 &lt;br /&gt;
 	def getControlPointListY(self):&lt;br /&gt;
 		return self.controlPointListY&lt;br /&gt;
 &lt;br /&gt;
 	def perform(self, x):&lt;br /&gt;
 		for i in range(0, len(self.controlPointListX)-2):&lt;br /&gt;
 			if (x &amp;amp;gt;= self.getXi(i)) and (x &amp;amp;lt; self.getXi(i+1)):&lt;br /&gt;
 				return self._subCubicSpline(x, i)&lt;br /&gt;
 &lt;br /&gt;
 		if x &amp;amp;gt;= self.getXi(len(self.controlPointListX)-2):&lt;br /&gt;
 			return self._subCubicSpline(x, len(self.controlPointListX)-2)&lt;br /&gt;
 &lt;br /&gt;
 	def _subCubicSpline(self, x, i):&lt;br /&gt;
 		return self.getAi(i) * ((x - self.getXi(i)) ** 3) + self.getBi(i) * ((x - self.getXi(i)) ** 2) + self.getCi(i) * ((x - self.getXi(i))) + self.getDi(i)&lt;br /&gt;
 &lt;br /&gt;
 	def deltaX(self, i):&lt;br /&gt;
 		return self.getXi(i+1) - self.getXi(i)&lt;br /&gt;
 &lt;br /&gt;
 	def deltaY(self, i):&lt;br /&gt;
 		return self.getYi(i+1) - self.getYi(i)&lt;br /&gt;
 &lt;br /&gt;
 	def _makeControlPointListY(self):&lt;br /&gt;
 		cplY = []&lt;br /&gt;
 		for x in self.controlPointListX:&lt;br /&gt;
 			cplY.append (givenFunction(x))&lt;br /&gt;
 		return cplY&lt;br /&gt;
 &lt;br /&gt;
 	def _makeMatrixA(self):&lt;br /&gt;
 		matrixA = self._makeEmptyMatrix()&lt;br /&gt;
 		for i in range(0,9):&lt;br /&gt;
 			matrixA[i][i] = 2 * (self.deltaX(i)+self.deltaX(i+1))&lt;br /&gt;
 			if i&amp;amp;gt;0:&lt;br /&gt;
 				matrixA[i-1][i] = self.deltaX(i)&lt;br /&gt;
 				matrixA[i][i-1] = self.deltaX(i)&lt;br /&gt;
 &lt;br /&gt;
 		return matrixA&lt;br /&gt;
 &lt;br /&gt;
 	def _makeMatrixB(self):&lt;br /&gt;
 		matrixB = []&lt;br /&gt;
 		for i in range(1,10):&lt;br /&gt;
 			matrixB.append([6 * ( self.deltaY(i)/self.deltaX(i) - self.deltaY(i-1)/self.deltaX(i-1) )])&lt;br /&gt;
 &lt;br /&gt;
 		return matrixB&lt;br /&gt;
 &lt;br /&gt;
 	def _makeDoublePrimeY(self):&lt;br /&gt;
 		a = self._makeMatrixA()&lt;br /&gt;
 		b = self._makeMatrixB()&lt;br /&gt;
 &lt;br /&gt;
 		l, u = LuDecomposition.LuDecomposition(a).perform()&lt;br /&gt;
 		matrixY = TriDiagonal.getMatrixY(l, b)&lt;br /&gt;
 		tempY = TriDiagonal.getMatrixX(u, matrixY)&lt;br /&gt;
 		tempY.insert(0, [0.0])&lt;br /&gt;
 		tempY.append([0.0])&lt;br /&gt;
 &lt;br /&gt;
 		return tempY&lt;br /&gt;
 &lt;br /&gt;
 	def _makeEmptyMatrix(self):&lt;br /&gt;
 		n = 9&lt;br /&gt;
 		matrix = []&lt;br /&gt;
 		for i in range(0,n):&lt;br /&gt;
 			row = []&lt;br /&gt;
 			for j in range(0,n):&lt;br /&gt;
 				row.append(0.0)&lt;br /&gt;
 			matrix.append(row)&lt;br /&gt;
 		return matrix&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>