From 00c08d99675a1b04c06bfbed2d72c06e73956c47 Mon Sep 17 00:00:00 2001 From: Vitor Hideyoshi Date: Mon, 23 Nov 2020 09:33:58 -0300 Subject: [PATCH] v1.3 v1.3 v1.3.1 v1.3.1 v1.3.1 v1.3.1 1.3.1 1.3.1 v1.3.2 v1.3.2 v1.3.2 v1.3.3 v1.3.3 v1.3.3 pip upload --- .../yoshi-otter1.2.tar.gz | Bin .../yoshi-otter1.2}/LICENSE | 0 .../yoshi-otter1.2}/Otter/Otter.py | 0 .../yoshi-otter1.2}/Otter/__init__.py | 0 .../yoshi-otter1.2}/README.md | 0 .../yoshi-otter1.2}/build/lib/Otter/Otter.py | 0 .../build/lib/Otter/__init__.py | 0 .../dist/yoshi-otter-1.1.tar.gz | Bin .../dist/yoshi_otter-1.1-py3-none-any.whl | Bin .../yoshi-otter1.2/setup.py | 0 .../yoshi_otter.egg-info/PKG-INFO | 0 .../yoshi_otter.egg-info/SOURCES.txt | 0 .../yoshi_otter.egg-info/dependency_links.txt | 0 .../yoshi_otter.egg-info/requires.txt | 0 .../yoshi_otter.egg-info/top_level.txt | 0 Older Versions/yoshi-otter1.3.1.tar.gz | Bin 0 -> 31953 bytes Older Versions/yoshi-otter1.3.1/LICENSE | 278 ++++++++++ .../yoshi-otter1.3.1/Otter/Otter.py | 517 ++++++++++++++++++ .../yoshi-otter1.3.1/Otter/__init__.py | 21 + Older Versions/yoshi-otter1.3.1/README.md | 75 +++ .../yoshi-otter1.3.1/build/lib/Otter/Otter.py | 517 ++++++++++++++++++ .../build/lib/Otter/__init__.py | 21 + .../dist/yoshi-otter-1.3.1.tar.gz | Bin 0 -> 5620 bytes .../dist/yoshi-otter-1.3.tar.gz | Bin 0 -> 5508 bytes .../dist/yoshi_otter-1.3-py3-none-any.whl | Bin 0 -> 12212 bytes .../dist/yoshi_otter-1.3.1-py3-none-any.whl | Bin 0 -> 12336 bytes Older Versions/yoshi-otter1.3.1/setup.py | 28 + .../yoshi_otter.egg-info/PKG-INFO | 91 +++ .../yoshi_otter.egg-info/SOURCES.txt | 9 + .../yoshi_otter.egg-info/dependency_links.txt | 1 + .../yoshi_otter.egg-info/requires.txt | 3 + .../yoshi_otter.egg-info/top_level.txt | 1 + Older Versions/yoshi-otter1.3.2.tar.xz | Bin 0 -> 27960 bytes Older Versions/yoshi-otter1.3.2/LICENSE | 278 ++++++++++ .../yoshi-otter1.3.2/Otter/Otter.py | 517 ++++++++++++++++++ .../yoshi-otter1.3.2/Otter/__init__.py | 21 + Older Versions/yoshi-otter1.3.2/README.md | 75 +++ .../yoshi-otter1.3.2/build/lib/Otter/Otter.py | 517 ++++++++++++++++++ .../build/lib/Otter/__init__.py | 21 + .../dist/yoshi-otter-1.3.2.tar.gz | Bin 0 -> 5610 bytes .../dist/yoshi_otter-1.3.2-py3-none-any.whl | Bin 0 -> 12333 bytes Older Versions/yoshi-otter1.3.2/setup.py | 28 + .../yoshi_otter.egg-info/PKG-INFO | 91 +++ .../yoshi_otter.egg-info/SOURCES.txt | 9 + .../yoshi_otter.egg-info/dependency_links.txt | 1 + .../yoshi_otter.egg-info/requires.txt | 3 + .../yoshi_otter.egg-info/top_level.txt | 1 + Older Versions/yoshi-otter1.3.tar.gz | Bin 0 -> 29955 bytes Older Versions/yoshi-otter1.3/LICENSE | 278 ++++++++++ Older Versions/yoshi-otter1.3/Otter/Otter.py | 499 +++++++++++++++++ .../yoshi-otter1.3/Otter/__init__.py | 21 + Older Versions/yoshi-otter1.3/README.md | 75 +++ .../yoshi-otter1.3/build/lib/Otter/Otter.py | 499 +++++++++++++++++ .../build/lib/Otter/__init__.py | 21 + .../dist/yoshi-otter-1.3.tar.gz | Bin 0 -> 5508 bytes .../dist/yoshi_otter-1.3-py3-none-any.whl | Bin 0 -> 12212 bytes .../yoshi-otter1.3}/setup.py | 2 +- .../yoshi_otter.egg-info/PKG-INFO | 91 +++ .../yoshi_otter.egg-info/SOURCES.txt | 9 + .../yoshi_otter.egg-info/dependency_links.txt | 1 + .../yoshi_otter.egg-info/requires.txt | 3 + .../yoshi_otter.egg-info/top_level.txt | 1 + README.md | 2 +- Source Code - Otter/Otter.py | 515 +++++++++++++++++ Source Code - Otter/__init__.py | 21 + yoshi-otter1.3.3.tar.xz | Bin 0 -> 27976 bytes yoshi-otter1.3.3/LICENSE | 278 ++++++++++ yoshi-otter1.3.3/Otter/Otter.py | 515 +++++++++++++++++ yoshi-otter1.3.3/Otter/__init__.py | 21 + yoshi-otter1.3.3/README.md | 75 +++ yoshi-otter1.3.3/build/lib/Otter/Otter.py | 515 +++++++++++++++++ yoshi-otter1.3.3/build/lib/Otter/__init__.py | 21 + .../dist/yoshi-otter-1.3.3.tar.gz | Bin 0 -> 5813 bytes .../dist/yoshi_otter-1.3.3-py3-none-any.whl | Bin 0 -> 12333 bytes yoshi-otter1.3.3/setup.py | 28 + .../yoshi_otter.egg-info/PKG-INFO | 91 +++ .../yoshi_otter.egg-info/SOURCES.txt | 9 + .../yoshi_otter.egg-info/dependency_links.txt | 1 + .../yoshi_otter.egg-info/requires.txt | 3 + .../yoshi_otter.egg-info/top_level.txt | 1 + 80 files changed, 6718 insertions(+), 2 deletions(-) rename yoshi-otter1.2.tar.gz => Older Versions/yoshi-otter1.2.tar.gz (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/LICENSE (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/Otter/Otter.py (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/Otter/__init__.py (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/README.md (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/build/lib/Otter/Otter.py (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/build/lib/Otter/__init__.py (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/dist/yoshi-otter-1.1.tar.gz (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/dist/yoshi_otter-1.1-py3-none-any.whl (100%) rename setup.py => Older Versions/yoshi-otter1.2/setup.py (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/yoshi_otter.egg-info/PKG-INFO (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/yoshi_otter.egg-info/SOURCES.txt (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/yoshi_otter.egg-info/dependency_links.txt (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/yoshi_otter.egg-info/requires.txt (100%) rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.2}/yoshi_otter.egg-info/top_level.txt (100%) create mode 100644 Older Versions/yoshi-otter1.3.1.tar.gz create mode 100644 Older Versions/yoshi-otter1.3.1/LICENSE create mode 100755 Older Versions/yoshi-otter1.3.1/Otter/Otter.py create mode 100644 Older Versions/yoshi-otter1.3.1/Otter/__init__.py create mode 100644 Older Versions/yoshi-otter1.3.1/README.md create mode 100644 Older Versions/yoshi-otter1.3.1/build/lib/Otter/Otter.py create mode 100644 Older Versions/yoshi-otter1.3.1/build/lib/Otter/__init__.py create mode 100644 Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.1.tar.gz create mode 100644 Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.tar.gz create mode 100644 Older Versions/yoshi-otter1.3.1/dist/yoshi_otter-1.3-py3-none-any.whl create mode 100644 Older Versions/yoshi-otter1.3.1/dist/yoshi_otter-1.3.1-py3-none-any.whl create mode 100644 Older Versions/yoshi-otter1.3.1/setup.py create mode 100644 Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/PKG-INFO create mode 100644 Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/SOURCES.txt create mode 100644 Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/dependency_links.txt create mode 100644 Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/requires.txt create mode 100644 Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/top_level.txt create mode 100644 Older Versions/yoshi-otter1.3.2.tar.xz create mode 100644 Older Versions/yoshi-otter1.3.2/LICENSE create mode 100755 Older Versions/yoshi-otter1.3.2/Otter/Otter.py create mode 100644 Older Versions/yoshi-otter1.3.2/Otter/__init__.py create mode 100644 Older Versions/yoshi-otter1.3.2/README.md create mode 100644 Older Versions/yoshi-otter1.3.2/build/lib/Otter/Otter.py create mode 100644 Older Versions/yoshi-otter1.3.2/build/lib/Otter/__init__.py create mode 100644 Older Versions/yoshi-otter1.3.2/dist/yoshi-otter-1.3.2.tar.gz create mode 100644 Older Versions/yoshi-otter1.3.2/dist/yoshi_otter-1.3.2-py3-none-any.whl create mode 100644 Older Versions/yoshi-otter1.3.2/setup.py create mode 100644 Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/PKG-INFO create mode 100644 Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/SOURCES.txt create mode 100644 Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/dependency_links.txt create mode 100644 Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/requires.txt create mode 100644 Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/top_level.txt create mode 100644 Older Versions/yoshi-otter1.3.tar.gz create mode 100644 Older Versions/yoshi-otter1.3/LICENSE create mode 100755 Older Versions/yoshi-otter1.3/Otter/Otter.py create mode 100644 Older Versions/yoshi-otter1.3/Otter/__init__.py create mode 100644 Older Versions/yoshi-otter1.3/README.md create mode 100644 Older Versions/yoshi-otter1.3/build/lib/Otter/Otter.py create mode 100644 Older Versions/yoshi-otter1.3/build/lib/Otter/__init__.py create mode 100644 Older Versions/yoshi-otter1.3/dist/yoshi-otter-1.3.tar.gz create mode 100644 Older Versions/yoshi-otter1.3/dist/yoshi_otter-1.3-py3-none-any.whl rename {yoshi-otter1.2 => Older Versions/yoshi-otter1.3}/setup.py (97%) create mode 100644 Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/PKG-INFO create mode 100644 Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/SOURCES.txt create mode 100644 Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/dependency_links.txt create mode 100644 Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/requires.txt create mode 100644 Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/top_level.txt create mode 100755 Source Code - Otter/Otter.py create mode 100644 Source Code - Otter/__init__.py create mode 100644 yoshi-otter1.3.3.tar.xz create mode 100644 yoshi-otter1.3.3/LICENSE create mode 100755 yoshi-otter1.3.3/Otter/Otter.py create mode 100644 yoshi-otter1.3.3/Otter/__init__.py create mode 100644 yoshi-otter1.3.3/README.md create mode 100644 yoshi-otter1.3.3/build/lib/Otter/Otter.py create mode 100644 yoshi-otter1.3.3/build/lib/Otter/__init__.py create mode 100644 yoshi-otter1.3.3/dist/yoshi-otter-1.3.3.tar.gz create mode 100644 yoshi-otter1.3.3/dist/yoshi_otter-1.3.3-py3-none-any.whl create mode 100644 yoshi-otter1.3.3/setup.py create mode 100644 yoshi-otter1.3.3/yoshi_otter.egg-info/PKG-INFO create mode 100644 yoshi-otter1.3.3/yoshi_otter.egg-info/SOURCES.txt create mode 100644 yoshi-otter1.3.3/yoshi_otter.egg-info/dependency_links.txt create mode 100644 yoshi-otter1.3.3/yoshi_otter.egg-info/requires.txt create mode 100644 yoshi-otter1.3.3/yoshi_otter.egg-info/top_level.txt diff --git a/yoshi-otter1.2.tar.gz b/Older Versions/yoshi-otter1.2.tar.gz similarity index 100% rename from yoshi-otter1.2.tar.gz rename to Older Versions/yoshi-otter1.2.tar.gz diff --git a/yoshi-otter1.2/LICENSE b/Older Versions/yoshi-otter1.2/LICENSE similarity index 100% rename from yoshi-otter1.2/LICENSE rename to Older Versions/yoshi-otter1.2/LICENSE diff --git a/yoshi-otter1.2/Otter/Otter.py b/Older Versions/yoshi-otter1.2/Otter/Otter.py similarity index 100% rename from yoshi-otter1.2/Otter/Otter.py rename to Older Versions/yoshi-otter1.2/Otter/Otter.py diff --git a/yoshi-otter1.2/Otter/__init__.py b/Older Versions/yoshi-otter1.2/Otter/__init__.py similarity index 100% rename from yoshi-otter1.2/Otter/__init__.py rename to Older Versions/yoshi-otter1.2/Otter/__init__.py diff --git a/yoshi-otter1.2/README.md b/Older Versions/yoshi-otter1.2/README.md similarity index 100% rename from yoshi-otter1.2/README.md rename to Older Versions/yoshi-otter1.2/README.md diff --git a/yoshi-otter1.2/build/lib/Otter/Otter.py b/Older Versions/yoshi-otter1.2/build/lib/Otter/Otter.py similarity index 100% rename from yoshi-otter1.2/build/lib/Otter/Otter.py rename to Older Versions/yoshi-otter1.2/build/lib/Otter/Otter.py diff --git a/yoshi-otter1.2/build/lib/Otter/__init__.py b/Older Versions/yoshi-otter1.2/build/lib/Otter/__init__.py similarity index 100% rename from yoshi-otter1.2/build/lib/Otter/__init__.py rename to Older Versions/yoshi-otter1.2/build/lib/Otter/__init__.py diff --git a/yoshi-otter1.2/dist/yoshi-otter-1.1.tar.gz b/Older Versions/yoshi-otter1.2/dist/yoshi-otter-1.1.tar.gz similarity index 100% rename from yoshi-otter1.2/dist/yoshi-otter-1.1.tar.gz rename to Older Versions/yoshi-otter1.2/dist/yoshi-otter-1.1.tar.gz diff --git a/yoshi-otter1.2/dist/yoshi_otter-1.1-py3-none-any.whl b/Older Versions/yoshi-otter1.2/dist/yoshi_otter-1.1-py3-none-any.whl similarity index 100% rename from yoshi-otter1.2/dist/yoshi_otter-1.1-py3-none-any.whl rename to Older Versions/yoshi-otter1.2/dist/yoshi_otter-1.1-py3-none-any.whl diff --git a/setup.py b/Older Versions/yoshi-otter1.2/setup.py similarity index 100% rename from setup.py rename to Older Versions/yoshi-otter1.2/setup.py diff --git a/yoshi-otter1.2/yoshi_otter.egg-info/PKG-INFO b/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/PKG-INFO similarity index 100% rename from yoshi-otter1.2/yoshi_otter.egg-info/PKG-INFO rename to Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/PKG-INFO diff --git a/yoshi-otter1.2/yoshi_otter.egg-info/SOURCES.txt b/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/SOURCES.txt similarity index 100% rename from yoshi-otter1.2/yoshi_otter.egg-info/SOURCES.txt rename to Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/SOURCES.txt diff --git a/yoshi-otter1.2/yoshi_otter.egg-info/dependency_links.txt b/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/dependency_links.txt similarity index 100% rename from yoshi-otter1.2/yoshi_otter.egg-info/dependency_links.txt rename to Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/dependency_links.txt diff --git a/yoshi-otter1.2/yoshi_otter.egg-info/requires.txt b/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/requires.txt similarity index 100% rename from yoshi-otter1.2/yoshi_otter.egg-info/requires.txt rename to Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/requires.txt diff --git a/yoshi-otter1.2/yoshi_otter.egg-info/top_level.txt b/Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/top_level.txt similarity index 100% rename from yoshi-otter1.2/yoshi_otter.egg-info/top_level.txt rename to Older Versions/yoshi-otter1.2/yoshi_otter.egg-info/top_level.txt diff --git a/Older Versions/yoshi-otter1.3.1.tar.gz b/Older Versions/yoshi-otter1.3.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..5f228f442d6fead6a919273fc9c10c055af060c8 GIT binary patch literal 31953 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 e: + + c = (a+b)/2 + fc = self.f(c) + + if (fa*fc) < 0: + + b = c + + else: + + a = c + fa = fc + + c = (a+b)/2 + + return c + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + def newton(self,a,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + da = self.d(a,e) + b = a - fa/da + + + while abs(a-b) > e: + + b = a + a -= (fa/da) + fa = self.f(a) + da = self.d(a,e) + + return a + + def bissec_newton(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + c = (a+b)/2 # 'c' é a raiz calculada + + while abs(a-b) > 0.1: + + fc = self.f(c) + + if fa*fc < 0: + + b = c + + else: + + a = c + fa = self.f(a) + + c = (a+b)/2 + + fc = self.f(c) + dc = self.d(c,e) + h = c - fc/dc # 'h' é uma variável de controle + + while abs(c-h) > e: + + h = c + c -= (fc/dc) + fc = self.f(c) + dc = self.d(c,e) + + return (c) + + + class Edo: + + def __init__(self, function): + self.F = function + + def euler(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return a + i*dx + + for i in range(n): + + y = y + (self.F(x(i),y))*dx + + return y + + def runge(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) + + return y + + def adams(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + f0 = self.F(x(i),y) + f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) + f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) + + y += (dx/12)*(5*f2 + 8*f1 - f0) + + return y + +class Interpolation: + """ Data should be organized in two columns: X and Y""" + + def __init__(self, data): + + self.data = data + self.polinomial = self.Polinomial(self.data) + + def minimus(self,x): + + theta = 0 + # somatorio de x + for i in range(self.data.shape[0]): + + theta += self.data.x[i] + + eta = 0 + #somatorio de y + for i in range(self.data.shape[0]): + + eta += self.data.y[i] + + sigma = 0 + #somatorio de xy + for i in range(self.data.shape[0]): + + sigma += self.data.x[i]*self.data.y[i] + + omega = 0 + #somatorio de x^2self.dself.dself.d + for i in range(self.data.shape[0]): + + omega += self.data.x[i]**2 + + + self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) + + self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) + + ym = 0 + + for i in range(self.data.shape[0]): + + ym += self.data.y[i]/self.data.shape[0] + + sqreq = 0 + + for i in range(self.data.shape[0]): + + sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 + + sqtot = 0 + + for i in range(self.data.shape[0]): + + sqtot += (self.data.y[i] - ym)**2 + + self.r2 = sqreq/sqtot + + return self.a*x + self.b + + class Polinomial: + + def __init__(self, data): + self.data = data + + def vandermonde(self, x): + + matrix = np.zeros((self.data.shape[0],self.data.shape[0])) + + for k in range(0, self.data.shape[0]): + + matrix[:,k] = self.data.x[:]**k + + self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) + + y = 0 + + for i in range(0,self.A.shape[0]): + + y += self.A[i]*(x**i) + + return float(y) + + def lagrange(self, x): + + def L(k,x): + + up = down = 1 + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + up = up*(x - self.data.x[i]) + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + down = down*(self.data.x[k] - self.data.x[i]) + + return up/down + + y = 0 + + for i in range(self.data.x.shape[0]): + + y += self.data.y[i]*L(i,x) + + return y + + def newton(self,x): + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) + j += 1 + + i += 1 + j = 0 + + def f(x): + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y + + self.f = f + + return f(x) + + def gregory(self,x): + + h = self.data.x[0] - self.data.x[1] + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) + j += 1 + + i += 1 + j = 0 + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/Otter/__init__.py b/Older Versions/yoshi-otter1.3.1/Otter/__init__.py new file mode 100644 index 0000000..08ce1fe --- /dev/null +++ b/Older Versions/yoshi-otter1.3.1/Otter/__init__.py @@ -0,0 +1,21 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. + +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from .Otter import Algebra as algebra +from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/README.md b/Older Versions/yoshi-otter1.3.1/README.md new file mode 100644 index 0000000..167eb4e --- /dev/null +++ b/Older Versions/yoshi-otter1.3.1/README.md @@ -0,0 +1,75 @@ +# Otter - Numeric Calculus + +This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: + +* Receive one variable function from user input + +* Receive two variable function from user input + +* Performe derivatives with one variable functions + +* Performe integral with received functions + +* Use methods to proccess the matrices. + +* Find root of functions throw method of bissection and method of newton + +* Solve Diferential Equations throw method of euler and runge + +* Performe Minimus Interpolation and Polinomial Interpolation + +## Syntax + +To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. + +To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. + +### Algebra + +Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). + +#### Integral + +To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. + +After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. + +The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. + +If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. + +#### Roots + +To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. + +The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. + +The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. + +If `e` is not defined the standart value is 10^(-6). + +#### Diferential Equations + +To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. + +The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. + +If `n` is not defined the standart value is 10^7. + +### Interpolation + +The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. + +To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. + +To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. + +## Installation + +To install the package from source `cd` into the directory and run: + +`pip install .` + +or run + +`pip install yoshi-otter` diff --git a/Older Versions/yoshi-otter1.3.1/build/lib/Otter/Otter.py b/Older Versions/yoshi-otter1.3.1/build/lib/Otter/Otter.py new file mode 100644 index 0000000..0e246e5 --- /dev/null +++ b/Older Versions/yoshi-otter1.3.1/build/lib/Otter/Otter.py @@ -0,0 +1,517 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. +# +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import math +import numpy as np +import pandas as pd +import Seals + +sl = Seals.process() + +class Algebra: + + def __init__(self, function): + self.f = function + self.integral = self.Integral(self.f) + self.roots = self.Roots(self.f) + self.edo = self.Edo(self.f) + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + class Integral: + + def __init__(self,function): + self.f = function + self.simple = self.Simple(function) + self.double = self.Double(function) + + class Simple: + def __init__(self, function): + self.f = function + + def riemann(self,a,b,n=None): + + if n is None: + n = 10**6 + + delta = (b-a)/n + + psi = a + theta = 0 + + while((psi+delta) <= b): + + theta += (self.f(psi) + self.f(psi + delta))/2 + psi += delta + + integral = delta*theta + + return integral + + def simpson(self,a,b,n=None): + + if n is None: + n = 10**6 + + def x(i): + return a + i*h + + h = (b-a)/n + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta = eta + self.f(x(2*psi - 1)) + psi = psi + 1 + + while(kappa <= ((n/2)-1)): + + theta = theta + self.f(x(2*kappa)) + kappa = kappa + 1 + + return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) + + + class Double: + + def __init__(self,function): + self.f = function + + def riemann(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + kappa = a + psi = c + theta = 0 + + while((psi + dy) < d): + + while((kappa + dx) < b): + + theta = theta + self.f(kappa, psi) + kappa = kappa + dx + + psi = psi + dy + kappa = a + + return theta*(dx)*(dy) + + def simpson(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + + def x(i): + + x = a + i*dx + + return x + + def y(i): + + y = c + i*dy + + return y + + def g(i): + + sigma = 0 + upsilon = 0 + + zeta = 1 + csi = 1 + + while(zeta <= (m/2)): + + sigma += self.f(x(i),y(2*zeta - 1)) + zeta += 1 + + while(csi <= ((m/2)-1)): + + upsilon += self.f(x(i),y(2*csi)) + csi += 1 + + return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta += g(2*psi - 1) + psi += 1 + + while(kappa <= ((n/2)-1)): + + theta += g(2*kappa) + kappa += 1 + + return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) + + class Roots: + + def __init__(self, function=None): + if function is not None: + self.f = function + + def bissec(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + while abs(a-b) > e: + + c = (a+b)/2 + fc = self.f(c) + + if (fa*fc) < 0: + + b = c + + else: + + a = c + fa = fc + + c = (a+b)/2 + + return c + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + def newton(self,a,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + da = self.d(a,e) + b = a - fa/da + + + while abs(a-b) > e: + + b = a + a -= (fa/da) + fa = self.f(a) + da = self.d(a,e) + + return a + + def bissec_newton(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + c = (a+b)/2 # 'c' é a raiz calculada + + while abs(a-b) > 0.1: + + fc = self.f(c) + + if fa*fc < 0: + + b = c + + else: + + a = c + fa = self.f(a) + + c = (a+b)/2 + + fc = self.f(c) + dc = self.d(c,e) + h = c - fc/dc # 'h' é uma variável de controle + + while abs(c-h) > e: + + h = c + c -= (fc/dc) + fc = self.f(c) + dc = self.d(c,e) + + return (c) + + + class Edo: + + def __init__(self, function): + self.F = function + + def euler(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return a + i*dx + + for i in range(n): + + y = y + (self.F(x(i),y))*dx + + return y + + def runge(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) + + return y + + def adams(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + f0 = self.F(x(i),y) + f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) + f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) + + y += (dx/12)*(5*f2 + 8*f1 - f0) + + return y + +class Interpolation: + """ Data should be organized in two columns: X and Y""" + + def __init__(self, data): + + self.data = data + self.polinomial = self.Polinomial(self.data) + + def minimus(self,x): + + theta = 0 + # somatorio de x + for i in range(self.data.shape[0]): + + theta += self.data.x[i] + + eta = 0 + #somatorio de y + for i in range(self.data.shape[0]): + + eta += self.data.y[i] + + sigma = 0 + #somatorio de xy + for i in range(self.data.shape[0]): + + sigma += self.data.x[i]*self.data.y[i] + + omega = 0 + #somatorio de x^2self.dself.dself.d + for i in range(self.data.shape[0]): + + omega += self.data.x[i]**2 + + + self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) + + self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) + + ym = 0 + + for i in range(self.data.shape[0]): + + ym += self.data.y[i]/self.data.shape[0] + + sqreq = 0 + + for i in range(self.data.shape[0]): + + sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 + + sqtot = 0 + + for i in range(self.data.shape[0]): + + sqtot += (self.data.y[i] - ym)**2 + + self.r2 = sqreq/sqtot + + return self.a*x + self.b + + class Polinomial: + + def __init__(self, data): + self.data = data + + def vandermonde(self, x): + + matrix = np.zeros((self.data.shape[0],self.data.shape[0])) + + for k in range(0, self.data.shape[0]): + + matrix[:,k] = self.data.x[:]**k + + self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) + + y = 0 + + for i in range(0,self.A.shape[0]): + + y += self.A[i]*(x**i) + + return float(y) + + def lagrange(self, x): + + def L(k,x): + + up = down = 1 + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + up = up*(x - self.data.x[i]) + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + down = down*(self.data.x[k] - self.data.x[i]) + + return up/down + + y = 0 + + for i in range(self.data.x.shape[0]): + + y += self.data.y[i]*L(i,x) + + return y + + def newton(self,x): + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) + j += 1 + + i += 1 + j = 0 + + def f(x): + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y + + self.f = f + + return f(x) + + def gregory(self,x): + + h = self.data.x[0] - self.data.x[1] + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) + j += 1 + + i += 1 + j = 0 + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/build/lib/Otter/__init__.py b/Older Versions/yoshi-otter1.3.1/build/lib/Otter/__init__.py new file mode 100644 index 0000000..08ce1fe --- /dev/null +++ b/Older Versions/yoshi-otter1.3.1/build/lib/Otter/__init__.py @@ -0,0 +1,21 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. + +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from .Otter import Algebra as algebra +from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.1.tar.gz b/Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d7a7c40ad935f397bc5a0f13a77d39b857ffdbf8 GIT binary patch literal 5620 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 literal 0 HcmV?d00001 diff --git a/Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.tar.gz b/Older Versions/yoshi-otter1.3.1/dist/yoshi-otter-1.3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e85b65b8ccce78c5e30f8cd74689e3381bc2ed3c GIT binary patch literal 5508 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 literal 0 HcmV?d00001 diff --git a/Older Versions/yoshi-otter1.3.1/dist/yoshi_otter-1.3-py3-none-any.whl b/Older Versions/yoshi-otter1.3.1/dist/yoshi_otter-1.3-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..995b13054f397dfed270acc74ac73fd39fbd4111 GIT binary patch literal 12212 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 Sb^y%Z8{;oep_%^i_WuChdKi`f literal 0 HcmV?d00001 diff --git a/Older Versions/yoshi-otter1.3.1/setup.py b/Older Versions/yoshi-otter1.3.1/setup.py new file mode 100644 index 0000000..10d5b33 --- /dev/null +++ b/Older Versions/yoshi-otter1.3.1/setup.py @@ -0,0 +1,28 @@ +import setuptools + +with open("README.md", "r") as fh: + long_description = fh.read() + +setuptools.setup( + name="yoshi-otter", # Replace with your own username + version="1.3.1", + author="Vitor Hideyoshi", + author_email="vitor.h.n.batista@gmail.com", + description="Numeric Calculus python module in the topic of Algebra Functions", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git", + packages=setuptools.find_packages(), + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", + "Operating System :: OS Independent", + "Development Status :: 2 - Pre-Alpha", + ], + python_requires='>=3.6', + install_requires=[ + 'numpy', + 'pandas', + 'yoshi-seals' + ], +) \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/PKG-INFO b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/PKG-INFO new file mode 100644 index 0000000..455b1cc --- /dev/null +++ b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/PKG-INFO @@ -0,0 +1,91 @@ +Metadata-Version: 2.1 +Name: yoshi-otter +Version: 1.3.1 +Summary: Numeric Calculus python module in the topic of Algebra Functions +Home-page: https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git +Author: Vitor Hideyoshi +Author-email: vitor.h.n.batista@gmail.com +License: UNKNOWN +Description: # Otter - Numeric Calculus + + This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: + + * Receive one variable function from user input + + * Receive two variable function from user input + + * Performe derivatives with one variable functions + + * Performe integral with received functions + + * Use methods to proccess the matrices. + + * Find root of functions throw method of bissection and method of newton + + * Solve Diferential Equations throw method of euler and runge + + * Performe Minimus Interpolation and Polinomial Interpolation + + ## Syntax + + To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. + + To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. + + ### Algebra + + Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). + + #### Integral + + To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. + + After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. + + The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. + + If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. + + #### Roots + + To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. + + The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. + + The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. + + If `e` is not defined the standart value is 10^(-6). + + #### Diferential Equations + + To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. + + The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. + + If `n` is not defined the standart value is 10^7. + + ### Interpolation + + The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. + + To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. + + To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. + + ## Installation + + To install the package from source `cd` into the directory and run: + + `pip install .` + + or run + + `pip install yoshi-otter` + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) +Classifier: Operating System :: OS Independent +Classifier: Development Status :: 2 - Pre-Alpha +Requires-Python: >=3.6 +Description-Content-Type: text/markdown diff --git a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/SOURCES.txt b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/SOURCES.txt new file mode 100644 index 0000000..5dc205c --- /dev/null +++ b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/SOURCES.txt @@ -0,0 +1,9 @@ +README.md +setup.py +Otter/Otter.py +Otter/__init__.py +yoshi_otter.egg-info/PKG-INFO +yoshi_otter.egg-info/SOURCES.txt +yoshi_otter.egg-info/dependency_links.txt +yoshi_otter.egg-info/requires.txt +yoshi_otter.egg-info/top_level.txt \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/dependency_links.txt b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/requires.txt b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/requires.txt new file mode 100644 index 0000000..11c1c26 --- /dev/null +++ b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/requires.txt @@ -0,0 +1,3 @@ +numpy +pandas +yoshi-seals diff --git a/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/top_level.txt b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/top_level.txt new file mode 100644 index 0000000..ccaaf54 --- /dev/null +++ b/Older Versions/yoshi-otter1.3.1/yoshi_otter.egg-info/top_level.txt @@ -0,0 +1 @@ +Otter diff --git a/Older Versions/yoshi-otter1.3.2.tar.xz b/Older Versions/yoshi-otter1.3.2.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..71945ad0ce1b314c39d9990f711166285b0b64c8 GIT binary patch literal 27960 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 e: + + c = (a+b)/2 + fc = self.f(c) + + if (fa*fc) < 0: + + b = c + + else: + + a = c + fa = fc + + c = (a+b)/2 + + return c + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + def newton(self,a,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + da = self.d(a,e) + b = a - fa/da + + + while abs(a-b) > e: + + b = a + a -= (fa/da) + fa = self.f(a) + da = self.d(a,e) + + return a + + def bissec_newton(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + c = (a+b)/2 # 'c' é a raiz calculada + + while abs(a-b) > 0.1: + + fc = self.f(c) + + if fa*fc < 0: + + b = c + + else: + + a = c + fa = self.f(a) + + c = (a+b)/2 + + fc = self.f(c) + dc = self.d(c,e) + h = c - fc/dc # 'h' é uma variável de controle + + while abs(c-h) > e: + + h = c + c -= (fc/dc) + fc = self.f(c) + dc = self.d(c,e) + + return (c) + + + class Edo: + + def __init__(self, function): + self.F = function + + def euler(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return a + i*dx + + for i in range(n): + + y = y + (self.F(x(i),y))*dx + + return y + + def runge(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) + + return y + + def adams(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + f0 = self.F(x(i),y) + f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) + f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) + + y += (dx/12)*(5*f2 + 8*f1 - f0) + + return y + +class Interpolation: + """ Data should be organized in two columns: X and Y""" + + def __init__(self, data): + + self.data = data + self.polinomial = self.Polinomial(self.data) + + def minimus(self,x): + + theta = 0 + # somatorio de x + for i in range(self.data.shape[0]): + + theta += self.data.x[i] + + eta = 0 + #somatorio de y + for i in range(self.data.shape[0]): + + eta += self.data.y[i] + + sigma = 0 + #somatorio de xy + for i in range(self.data.shape[0]): + + sigma += self.data.x[i]*self.data.y[i] + + omega = 0 + #somatorio de x^2self.dself.dself.d + for i in range(self.data.shape[0]): + + omega += self.data.x[i]**2 + + + self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) + + self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) + + ym = 0 + + for i in range(self.data.shape[0]): + + ym += self.data.y[i]/self.data.shape[0] + + sqreq = 0 + + for i in range(self.data.shape[0]): + + sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 + + sqtot = 0 + + for i in range(self.data.shape[0]): + + sqtot += (self.data.y[i] - ym)**2 + + self.r2 = sqreq/sqtot + + return self.a*x + self.b + + class Polinomial: + + def __init__(self, data): + self.data = data + + def vandermonde(self, x): + + matrix = np.zeros((self.data.shape[0],self.data.shape[0])) + + for k in range(0, self.data.shape[0]): + + matrix[:,k] = self.data.x[:]**k + + self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) + + y = 0 + + for i in range(0,self.A.shape[0]): + + y += self.A[i]*(x**i) + + return float(y) + + def lagrange(self, x): + + def L(k,x): + + up = down = 1 + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + up = up*(x - self.data.x[i]) + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + down = down*(self.data.x[k] - self.data.x[i]) + + return up/down + + y = 0 + + for i in range(self.data.x.shape[0]): + + y += self.data.y[i]*L(i,x) + + return y + + def newton(self,x): + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) + j += 1 + + i += 1 + j = 0 + + def f(x): + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y + + self.f = f + + return f(x) + + def gregory(self,x): + + h = self.data.x[0] - self.data.x[1] + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) + j += 1 + + i += 1 + j = 0 + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/Otter/__init__.py b/Older Versions/yoshi-otter1.3.2/Otter/__init__.py new file mode 100644 index 0000000..08ce1fe --- /dev/null +++ b/Older Versions/yoshi-otter1.3.2/Otter/__init__.py @@ -0,0 +1,21 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. + +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from .Otter import Algebra as algebra +from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/README.md b/Older Versions/yoshi-otter1.3.2/README.md new file mode 100644 index 0000000..167eb4e --- /dev/null +++ b/Older Versions/yoshi-otter1.3.2/README.md @@ -0,0 +1,75 @@ +# Otter - Numeric Calculus + +This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: + +* Receive one variable function from user input + +* Receive two variable function from user input + +* Performe derivatives with one variable functions + +* Performe integral with received functions + +* Use methods to proccess the matrices. + +* Find root of functions throw method of bissection and method of newton + +* Solve Diferential Equations throw method of euler and runge + +* Performe Minimus Interpolation and Polinomial Interpolation + +## Syntax + +To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. + +To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. + +### Algebra + +Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). + +#### Integral + +To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. + +After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. + +The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. + +If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. + +#### Roots + +To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. + +The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. + +The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. + +If `e` is not defined the standart value is 10^(-6). + +#### Diferential Equations + +To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. + +The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. + +If `n` is not defined the standart value is 10^7. + +### Interpolation + +The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. + +To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. + +To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. + +## Installation + +To install the package from source `cd` into the directory and run: + +`pip install .` + +or run + +`pip install yoshi-otter` diff --git a/Older Versions/yoshi-otter1.3.2/build/lib/Otter/Otter.py b/Older Versions/yoshi-otter1.3.2/build/lib/Otter/Otter.py new file mode 100644 index 0000000..967c47a --- /dev/null +++ b/Older Versions/yoshi-otter1.3.2/build/lib/Otter/Otter.py @@ -0,0 +1,517 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. +# +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import math +import numpy as np +import pandas as pd +import Seals + +sl = Seals.process + +class Algebra: + + def __init__(self, function): + self.f = function + self.integral = self.Integral(self.f) + self.roots = self.Roots(self.f) + self.edo = self.Edo(self.f) + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + class Integral: + + def __init__(self,function): + self.f = function + self.simple = self.Simple(function) + self.double = self.Double(function) + + class Simple: + def __init__(self, function): + self.f = function + + def riemann(self,a,b,n=None): + + if n is None: + n = 10**6 + + delta = (b-a)/n + + psi = a + theta = 0 + + while((psi+delta) <= b): + + theta += (self.f(psi) + self.f(psi + delta))/2 + psi += delta + + integral = delta*theta + + return integral + + def simpson(self,a,b,n=None): + + if n is None: + n = 10**6 + + def x(i): + return a + i*h + + h = (b-a)/n + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta = eta + self.f(x(2*psi - 1)) + psi = psi + 1 + + while(kappa <= ((n/2)-1)): + + theta = theta + self.f(x(2*kappa)) + kappa = kappa + 1 + + return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) + + + class Double: + + def __init__(self,function): + self.f = function + + def riemann(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + kappa = a + psi = c + theta = 0 + + while((psi + dy) < d): + + while((kappa + dx) < b): + + theta = theta + self.f(kappa, psi) + kappa = kappa + dx + + psi = psi + dy + kappa = a + + return theta*(dx)*(dy) + + def simpson(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + + def x(i): + + x = a + i*dx + + return x + + def y(i): + + y = c + i*dy + + return y + + def g(i): + + sigma = 0 + upsilon = 0 + + zeta = 1 + csi = 1 + + while(zeta <= (m/2)): + + sigma += self.f(x(i),y(2*zeta - 1)) + zeta += 1 + + while(csi <= ((m/2)-1)): + + upsilon += self.f(x(i),y(2*csi)) + csi += 1 + + return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta += g(2*psi - 1) + psi += 1 + + while(kappa <= ((n/2)-1)): + + theta += g(2*kappa) + kappa += 1 + + return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) + + class Roots: + + def __init__(self, function=None): + if function is not None: + self.f = function + + def bissec(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + while abs(a-b) > e: + + c = (a+b)/2 + fc = self.f(c) + + if (fa*fc) < 0: + + b = c + + else: + + a = c + fa = fc + + c = (a+b)/2 + + return c + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + def newton(self,a,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + da = self.d(a,e) + b = a - fa/da + + + while abs(a-b) > e: + + b = a + a -= (fa/da) + fa = self.f(a) + da = self.d(a,e) + + return a + + def bissec_newton(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + c = (a+b)/2 # 'c' é a raiz calculada + + while abs(a-b) > 0.1: + + fc = self.f(c) + + if fa*fc < 0: + + b = c + + else: + + a = c + fa = self.f(a) + + c = (a+b)/2 + + fc = self.f(c) + dc = self.d(c,e) + h = c - fc/dc # 'h' é uma variável de controle + + while abs(c-h) > e: + + h = c + c -= (fc/dc) + fc = self.f(c) + dc = self.d(c,e) + + return (c) + + + class Edo: + + def __init__(self, function): + self.F = function + + def euler(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return a + i*dx + + for i in range(n): + + y = y + (self.F(x(i),y))*dx + + return y + + def runge(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) + + return y + + def adams(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + f0 = self.F(x(i),y) + f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) + f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) + + y += (dx/12)*(5*f2 + 8*f1 - f0) + + return y + +class Interpolation: + """ Data should be organized in two columns: X and Y""" + + def __init__(self, data): + + self.data = data + self.polinomial = self.Polinomial(self.data) + + def minimus(self,x): + + theta = 0 + # somatorio de x + for i in range(self.data.shape[0]): + + theta += self.data.x[i] + + eta = 0 + #somatorio de y + for i in range(self.data.shape[0]): + + eta += self.data.y[i] + + sigma = 0 + #somatorio de xy + for i in range(self.data.shape[0]): + + sigma += self.data.x[i]*self.data.y[i] + + omega = 0 + #somatorio de x^2self.dself.dself.d + for i in range(self.data.shape[0]): + + omega += self.data.x[i]**2 + + + self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) + + self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) + + ym = 0 + + for i in range(self.data.shape[0]): + + ym += self.data.y[i]/self.data.shape[0] + + sqreq = 0 + + for i in range(self.data.shape[0]): + + sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 + + sqtot = 0 + + for i in range(self.data.shape[0]): + + sqtot += (self.data.y[i] - ym)**2 + + self.r2 = sqreq/sqtot + + return self.a*x + self.b + + class Polinomial: + + def __init__(self, data): + self.data = data + + def vandermonde(self, x): + + matrix = np.zeros((self.data.shape[0],self.data.shape[0])) + + for k in range(0, self.data.shape[0]): + + matrix[:,k] = self.data.x[:]**k + + self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) + + y = 0 + + for i in range(0,self.A.shape[0]): + + y += self.A[i]*(x**i) + + return float(y) + + def lagrange(self, x): + + def L(k,x): + + up = down = 1 + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + up = up*(x - self.data.x[i]) + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + down = down*(self.data.x[k] - self.data.x[i]) + + return up/down + + y = 0 + + for i in range(self.data.x.shape[0]): + + y += self.data.y[i]*L(i,x) + + return y + + def newton(self,x): + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) + j += 1 + + i += 1 + j = 0 + + def f(x): + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y + + self.f = f + + return f(x) + + def gregory(self,x): + + h = self.data.x[0] - self.data.x[1] + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) + j += 1 + + i += 1 + j = 0 + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/build/lib/Otter/__init__.py b/Older Versions/yoshi-otter1.3.2/build/lib/Otter/__init__.py new file mode 100644 index 0000000..08ce1fe --- /dev/null +++ b/Older Versions/yoshi-otter1.3.2/build/lib/Otter/__init__.py @@ -0,0 +1,21 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. + +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from .Otter import Algebra as algebra +from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/dist/yoshi-otter-1.3.2.tar.gz b/Older Versions/yoshi-otter1.3.2/dist/yoshi-otter-1.3.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..fa873acf18f6b821eb63ff3f7ef075b6f00f1eb7 GIT binary patch literal 5610 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 I_>Z^$13V@Yh5!Hn literal 0 HcmV?d00001 diff --git a/Older Versions/yoshi-otter1.3.2/setup.py b/Older Versions/yoshi-otter1.3.2/setup.py new file mode 100644 index 0000000..c29b1e8 --- /dev/null +++ b/Older Versions/yoshi-otter1.3.2/setup.py @@ -0,0 +1,28 @@ +import setuptools + +with open("README.md", "r") as fh: + long_description = fh.read() + +setuptools.setup( + name="yoshi-otter", # Replace with your own username + version="1.3.2", + author="Vitor Hideyoshi", + author_email="vitor.h.n.batista@gmail.com", + description="Numeric Calculus python module in the topic of Algebra Functions", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git", + packages=setuptools.find_packages(), + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", + "Operating System :: OS Independent", + "Development Status :: 2 - Pre-Alpha", + ], + python_requires='>=3.6', + install_requires=[ + 'numpy', + 'pandas', + 'yoshi-seals' + ], +) \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/PKG-INFO b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/PKG-INFO new file mode 100644 index 0000000..a0f9ee7 --- /dev/null +++ b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/PKG-INFO @@ -0,0 +1,91 @@ +Metadata-Version: 2.1 +Name: yoshi-otter +Version: 1.3.2 +Summary: Numeric Calculus python module in the topic of Algebra Functions +Home-page: https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git +Author: Vitor Hideyoshi +Author-email: vitor.h.n.batista@gmail.com +License: UNKNOWN +Description: # Otter - Numeric Calculus + + This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: + + * Receive one variable function from user input + + * Receive two variable function from user input + + * Performe derivatives with one variable functions + + * Performe integral with received functions + + * Use methods to proccess the matrices. + + * Find root of functions throw method of bissection and method of newton + + * Solve Diferential Equations throw method of euler and runge + + * Performe Minimus Interpolation and Polinomial Interpolation + + ## Syntax + + To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. + + To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. + + ### Algebra + + Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). + + #### Integral + + To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. + + After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. + + The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. + + If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. + + #### Roots + + To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. + + The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. + + The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. + + If `e` is not defined the standart value is 10^(-6). + + #### Diferential Equations + + To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. + + The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. + + If `n` is not defined the standart value is 10^7. + + ### Interpolation + + The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. + + To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. + + To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. + + ## Installation + + To install the package from source `cd` into the directory and run: + + `pip install .` + + or run + + `pip install yoshi-otter` + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) +Classifier: Operating System :: OS Independent +Classifier: Development Status :: 2 - Pre-Alpha +Requires-Python: >=3.6 +Description-Content-Type: text/markdown diff --git a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/SOURCES.txt b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/SOURCES.txt new file mode 100644 index 0000000..5dc205c --- /dev/null +++ b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/SOURCES.txt @@ -0,0 +1,9 @@ +README.md +setup.py +Otter/Otter.py +Otter/__init__.py +yoshi_otter.egg-info/PKG-INFO +yoshi_otter.egg-info/SOURCES.txt +yoshi_otter.egg-info/dependency_links.txt +yoshi_otter.egg-info/requires.txt +yoshi_otter.egg-info/top_level.txt \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/dependency_links.txt b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/requires.txt b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/requires.txt new file mode 100644 index 0000000..11c1c26 --- /dev/null +++ b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/requires.txt @@ -0,0 +1,3 @@ +numpy +pandas +yoshi-seals diff --git a/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/top_level.txt b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/top_level.txt new file mode 100644 index 0000000..ccaaf54 --- /dev/null +++ b/Older Versions/yoshi-otter1.3.2/yoshi_otter.egg-info/top_level.txt @@ -0,0 +1 @@ +Otter diff --git a/Older Versions/yoshi-otter1.3.tar.gz b/Older Versions/yoshi-otter1.3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9996e1193983988d32f3cb09ace4d21d2dbe7450 GIT binary patch literal 29955 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 SKE>yM^7((~nL-2rPyql?f*ThA literal 0 HcmV?d00001 diff --git a/Older Versions/yoshi-otter1.3/LICENSE b/Older Versions/yoshi-otter1.3/LICENSE new file mode 100644 index 0000000..d2c5abe --- /dev/null +++ b/Older Versions/yoshi-otter1.3/LICENSE @@ -0,0 +1,278 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/Otter/Otter.py b/Older Versions/yoshi-otter1.3/Otter/Otter.py new file mode 100755 index 0000000..ae4a8cd --- /dev/null +++ b/Older Versions/yoshi-otter1.3/Otter/Otter.py @@ -0,0 +1,499 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. +# +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import math +import numpy as np +import Seals + +sl = Seals.process() + +class Algebra: + + def __init__(self, function): + self.f = function + self.integral = self.Integral(self.f) + self.roots = self.Roots(self.f) + self.edo = self.Edo(self.f) + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + class Integral: + + def __init__(self,function): + self.f = function + self.simple = self.Simple(function) + self.double = self.Double(function) + + class Simple: + def __init__(self, function): + self.f = function + + def riemann(self,a,b,n=None): + + if n is None: + n = 10**6 + + delta = (b-a)/n + + psi = a + theta = 0 + + while((psi+delta) <= b): + + theta += (self.f(psi) + self.f(psi + delta))/2 + psi += delta + + integral = delta*theta + + return integral + + def simpson(self,a,b,n=None): + + if n is None: + n = 10**6 + + def x(i): + return a + i*h + + h = (b-a)/n + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta = eta + self.f(x(2*psi - 1)) + psi = psi + 1 + + while(kappa <= ((n/2)-1)): + + theta = theta + self.f(x(2*kappa)) + kappa = kappa + 1 + + return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) + + + class Double: + + def __init__(self,function): + self.f = function + + def riemann(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + kappa = a + psi = c + theta = 0 + + while((psi + dy) < d): + + while((kappa + dx) < b): + + theta = theta + self.f(kappa, psi) + kappa = kappa + dx + + psi = psi + dy + kappa = a + + return theta*(dx)*(dy) + + def simpson(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + + def x(i): + + x = a + i*dx + + return x + + def y(i): + + y = c + i*dy + + return y + + def g(i): + + sigma = 0 + upsilon = 0 + + zeta = 1 + csi = 1 + + while(zeta <= (m/2)): + + sigma += self.f(x(i),y(2*zeta - 1)) + zeta += 1 + + while(csi <= ((m/2)-1)): + + upsilon += self.f(x(i),y(2*csi)) + csi += 1 + + return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta += g(2*psi - 1) + psi += 1 + + while(kappa <= ((n/2)-1)): + + theta += g(2*kappa) + kappa += 1 + + return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) + + class Roots: + + def __init__(self, function=None): + if function is not None: + self.f = function + + def bissec(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + while abs(a-b) > e: + + c = (a+b)/2 + fc = self.f(c) + + if (fa*fc) < 0: + + b = c + + else: + + a = c + fa = fc + + c = (a+b)/2 + + return c + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + def newton(self,a,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + da = self.d(a,e) + b = a - fa/da + + + while abs(a-b) > e: + + b = a + a -= (fa/da) + fa = self.f(a) + da = self.d(a,e) + + return a + + def bissec_newton(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + c = (a+b)/2 # 'c' é a raiz calculada + + while abs(a-b) > 0.1: + + fc = self.f(c) + + if fa*fc < 0: + + b = c + + else: + + a = c + fa = self.f(a) + + c = (a+b)/2 + + fc = self.f(c) + dc = self.d(c,e) + h = c - fc/dc # 'h' é uma variável de controle + + while abs(c-h) > e: + + h = c + c -= (fc/dc) + fc = self.f(c) + dc = self.d(c,e) + + return (c) + + + class Edo: + + def __init__(self, function): + self.f = function + + def euler(self,a,y,b,n=None): + + if n is None: + n = 10**7 + + dx = (b-a)/n + + def x(i): + return a + i*dx + + for i in range(n): + + y = y + (self.f(x(i),y))*dx + + return y + + def runge(self,a,y,b,n=None): + + if n is None: + n = 10**7 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + y = y + (dx/2)*(self.f(x(i),y)+self.f(x(i+1),(y+(dx*self.f(x(i),y))))) + + return y + +class Interpolation: + """ Data should be organized in two columns: X and Y""" + + def __init__(self, data): + + self.data = data + self.polinomial = self.Polinomial(self.data) + + def minimus(self,x): + + theta = 0 + # somatorio de x + for i in range(self.data.shape[0]): + + theta += self.data[i][0] + + eta = 0 + #somatorio de y + for i in range(self.data.shape[0]): + + eta += self.data[i][1] + + sigma = 0 + #somatorio de xy + for i in range(self.data.shape[0]): + + sigma += self.data[i][0]*self.data[i][1] + + omega = 0 + #somatorio de x^2 + for i in range(self.data.shape[0]): + + omega += self.data[i][0]**2 + + + self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) + + self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) + + ym = 0 + + for i in range(self.data.shape[0]): + + ym += self.data[i][1]/self.data.shape[0] + + sqreq = 0 + + for i in range(self.data.shape[0]): + + sqreq += ((self.a*self.data[i][0] + self.b) - ym)**2 + + sqtot = 0 + + for i in range(self.data.shape[0]): + + sqtot += (self.data[i][1] - ym)**2 + + self.r2 = sqreq/sqtot + + return self.a*x + self.b + + class Polinomial: + + def __init__(self, data): + self.data = data + + def vandermonde(self, x): + + matrix = np.zeros((self.data.shape[0],self.data.shape[0])) + + for k in range(0, self.data.shape[0]): + + matrix[:,k] = self.data[:,0]**k + + self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) + + y = 0 + + for i in range(0,self.A.shape[0]): + + y += self.A[i]*(x**i) + + return float(y) + + def lagrange(self, x): + + data_x = self.data[:,0] + data_y = self.data[:,1] + + def L(k,x): + + up = down = 1 + + for i in [x for x in range(data_x.shape[0]) if x != k]: + up = up*(x - data_x[i]) + + for i in [x for x in range(data_x.shape[0]) if x != k]: + down = down*(data_x[k] - data_x[i]) + + return up/down + + y = 0 + + for i in range(data_x.shape[0]): + + y += data_y[i]*L(i,x) + + return y + + def newton(self,x): + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data[:,1] + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data[(i+1)+j][0]-self.data[j][0]) + j += 1 + + i += 1 + j = 0 + + def f(x): + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data[k][0]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y + + self.f = f + + return f(x) + + def gregory(self,x): + + h = self.data[0][0] - self.data[1][0] + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data[:,1] + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) + j += 1 + + i += 1 + j = 0 + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data[k][0]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/Otter/__init__.py b/Older Versions/yoshi-otter1.3/Otter/__init__.py new file mode 100644 index 0000000..08ce1fe --- /dev/null +++ b/Older Versions/yoshi-otter1.3/Otter/__init__.py @@ -0,0 +1,21 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. + +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from .Otter import Algebra as algebra +from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/README.md b/Older Versions/yoshi-otter1.3/README.md new file mode 100644 index 0000000..05245f1 --- /dev/null +++ b/Older Versions/yoshi-otter1.3/README.md @@ -0,0 +1,75 @@ +# Otter - Numeric Calculus + +This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: + +* Receive one variable function from user input + +* Receive two variable function from user input + +* Performe derivatives with one variable functions + +* Performe integral with received functions + +* Use methods to proccess the matrices. + +* Find root of functions throw method of bissection and method of newton + +* Solve Diferential Equations throw method of euler and runge + +* Performe Minimus Interpolation and Polinomial Interpolation + +## Syntax + +To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. + +To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. + +### Algebra + +Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). + +#### Integral + +To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. + +After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. + +The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. + +If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. + +#### Roots + +To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. + +The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. + +The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. + +If `e` is not defined the standart value is 10^(-6). + +#### Diferential Equations + +To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. + +The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. + +If `n` is not defined the standart value is 10^7. + +### Interpolation + +The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. + +To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. + +To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. + +## Installation + +To install the package from source `cd` into the directory and run: + +`pip install .` + +or run + +`pip install yoshi-otter` diff --git a/Older Versions/yoshi-otter1.3/build/lib/Otter/Otter.py b/Older Versions/yoshi-otter1.3/build/lib/Otter/Otter.py new file mode 100644 index 0000000..ae4a8cd --- /dev/null +++ b/Older Versions/yoshi-otter1.3/build/lib/Otter/Otter.py @@ -0,0 +1,499 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. +# +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import math +import numpy as np +import Seals + +sl = Seals.process() + +class Algebra: + + def __init__(self, function): + self.f = function + self.integral = self.Integral(self.f) + self.roots = self.Roots(self.f) + self.edo = self.Edo(self.f) + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + class Integral: + + def __init__(self,function): + self.f = function + self.simple = self.Simple(function) + self.double = self.Double(function) + + class Simple: + def __init__(self, function): + self.f = function + + def riemann(self,a,b,n=None): + + if n is None: + n = 10**6 + + delta = (b-a)/n + + psi = a + theta = 0 + + while((psi+delta) <= b): + + theta += (self.f(psi) + self.f(psi + delta))/2 + psi += delta + + integral = delta*theta + + return integral + + def simpson(self,a,b,n=None): + + if n is None: + n = 10**6 + + def x(i): + return a + i*h + + h = (b-a)/n + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta = eta + self.f(x(2*psi - 1)) + psi = psi + 1 + + while(kappa <= ((n/2)-1)): + + theta = theta + self.f(x(2*kappa)) + kappa = kappa + 1 + + return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) + + + class Double: + + def __init__(self,function): + self.f = function + + def riemann(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + kappa = a + psi = c + theta = 0 + + while((psi + dy) < d): + + while((kappa + dx) < b): + + theta = theta + self.f(kappa, psi) + kappa = kappa + dx + + psi = psi + dy + kappa = a + + return theta*(dx)*(dy) + + def simpson(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + + def x(i): + + x = a + i*dx + + return x + + def y(i): + + y = c + i*dy + + return y + + def g(i): + + sigma = 0 + upsilon = 0 + + zeta = 1 + csi = 1 + + while(zeta <= (m/2)): + + sigma += self.f(x(i),y(2*zeta - 1)) + zeta += 1 + + while(csi <= ((m/2)-1)): + + upsilon += self.f(x(i),y(2*csi)) + csi += 1 + + return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta += g(2*psi - 1) + psi += 1 + + while(kappa <= ((n/2)-1)): + + theta += g(2*kappa) + kappa += 1 + + return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) + + class Roots: + + def __init__(self, function=None): + if function is not None: + self.f = function + + def bissec(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + while abs(a-b) > e: + + c = (a+b)/2 + fc = self.f(c) + + if (fa*fc) < 0: + + b = c + + else: + + a = c + fa = fc + + c = (a+b)/2 + + return c + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + def newton(self,a,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + da = self.d(a,e) + b = a - fa/da + + + while abs(a-b) > e: + + b = a + a -= (fa/da) + fa = self.f(a) + da = self.d(a,e) + + return a + + def bissec_newton(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + c = (a+b)/2 # 'c' é a raiz calculada + + while abs(a-b) > 0.1: + + fc = self.f(c) + + if fa*fc < 0: + + b = c + + else: + + a = c + fa = self.f(a) + + c = (a+b)/2 + + fc = self.f(c) + dc = self.d(c,e) + h = c - fc/dc # 'h' é uma variável de controle + + while abs(c-h) > e: + + h = c + c -= (fc/dc) + fc = self.f(c) + dc = self.d(c,e) + + return (c) + + + class Edo: + + def __init__(self, function): + self.f = function + + def euler(self,a,y,b,n=None): + + if n is None: + n = 10**7 + + dx = (b-a)/n + + def x(i): + return a + i*dx + + for i in range(n): + + y = y + (self.f(x(i),y))*dx + + return y + + def runge(self,a,y,b,n=None): + + if n is None: + n = 10**7 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + y = y + (dx/2)*(self.f(x(i),y)+self.f(x(i+1),(y+(dx*self.f(x(i),y))))) + + return y + +class Interpolation: + """ Data should be organized in two columns: X and Y""" + + def __init__(self, data): + + self.data = data + self.polinomial = self.Polinomial(self.data) + + def minimus(self,x): + + theta = 0 + # somatorio de x + for i in range(self.data.shape[0]): + + theta += self.data[i][0] + + eta = 0 + #somatorio de y + for i in range(self.data.shape[0]): + + eta += self.data[i][1] + + sigma = 0 + #somatorio de xy + for i in range(self.data.shape[0]): + + sigma += self.data[i][0]*self.data[i][1] + + omega = 0 + #somatorio de x^2 + for i in range(self.data.shape[0]): + + omega += self.data[i][0]**2 + + + self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) + + self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) + + ym = 0 + + for i in range(self.data.shape[0]): + + ym += self.data[i][1]/self.data.shape[0] + + sqreq = 0 + + for i in range(self.data.shape[0]): + + sqreq += ((self.a*self.data[i][0] + self.b) - ym)**2 + + sqtot = 0 + + for i in range(self.data.shape[0]): + + sqtot += (self.data[i][1] - ym)**2 + + self.r2 = sqreq/sqtot + + return self.a*x + self.b + + class Polinomial: + + def __init__(self, data): + self.data = data + + def vandermonde(self, x): + + matrix = np.zeros((self.data.shape[0],self.data.shape[0])) + + for k in range(0, self.data.shape[0]): + + matrix[:,k] = self.data[:,0]**k + + self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) + + y = 0 + + for i in range(0,self.A.shape[0]): + + y += self.A[i]*(x**i) + + return float(y) + + def lagrange(self, x): + + data_x = self.data[:,0] + data_y = self.data[:,1] + + def L(k,x): + + up = down = 1 + + for i in [x for x in range(data_x.shape[0]) if x != k]: + up = up*(x - data_x[i]) + + for i in [x for x in range(data_x.shape[0]) if x != k]: + down = down*(data_x[k] - data_x[i]) + + return up/down + + y = 0 + + for i in range(data_x.shape[0]): + + y += data_y[i]*L(i,x) + + return y + + def newton(self,x): + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data[:,1] + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data[(i+1)+j][0]-self.data[j][0]) + j += 1 + + i += 1 + j = 0 + + def f(x): + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data[k][0]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y + + self.f = f + + return f(x) + + def gregory(self,x): + + h = self.data[0][0] - self.data[1][0] + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data[:,1] + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) + j += 1 + + i += 1 + j = 0 + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data[k][0]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/build/lib/Otter/__init__.py b/Older Versions/yoshi-otter1.3/build/lib/Otter/__init__.py new file mode 100644 index 0000000..08ce1fe --- /dev/null +++ b/Older Versions/yoshi-otter1.3/build/lib/Otter/__init__.py @@ -0,0 +1,21 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. + +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from .Otter import Algebra as algebra +from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/dist/yoshi-otter-1.3.tar.gz b/Older Versions/yoshi-otter1.3/dist/yoshi-otter-1.3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e85b65b8ccce78c5e30f8cd74689e3381bc2ed3c GIT binary patch literal 5508 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 literal 0 HcmV?d00001 diff --git a/Older Versions/yoshi-otter1.3/dist/yoshi_otter-1.3-py3-none-any.whl b/Older Versions/yoshi-otter1.3/dist/yoshi_otter-1.3-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..995b13054f397dfed270acc74ac73fd39fbd4111 GIT binary patch literal 12212 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.6 +Description-Content-Type: text/markdown diff --git a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/SOURCES.txt b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/SOURCES.txt new file mode 100644 index 0000000..5dc205c --- /dev/null +++ b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/SOURCES.txt @@ -0,0 +1,9 @@ +README.md +setup.py +Otter/Otter.py +Otter/__init__.py +yoshi_otter.egg-info/PKG-INFO +yoshi_otter.egg-info/SOURCES.txt +yoshi_otter.egg-info/dependency_links.txt +yoshi_otter.egg-info/requires.txt +yoshi_otter.egg-info/top_level.txt \ No newline at end of file diff --git a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/dependency_links.txt b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/requires.txt b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/requires.txt new file mode 100644 index 0000000..11c1c26 --- /dev/null +++ b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/requires.txt @@ -0,0 +1,3 @@ +numpy +pandas +yoshi-seals diff --git a/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/top_level.txt b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/top_level.txt new file mode 100644 index 0000000..ccaaf54 --- /dev/null +++ b/Older Versions/yoshi-otter1.3/yoshi_otter.egg-info/top_level.txt @@ -0,0 +1 @@ +Otter diff --git a/README.md b/README.md index 05245f1..167eb4e 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ If `n` is not defined the standart value is 10^7. The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. -To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. +To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. diff --git a/Source Code - Otter/Otter.py b/Source Code - Otter/Otter.py new file mode 100755 index 0000000..6a91ddc --- /dev/null +++ b/Source Code - Otter/Otter.py @@ -0,0 +1,515 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. +# +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import math +import numpy as np +import pandas as pd +from Seals import process as sl + +class Algebra: + + def __init__(self, function): + self.f = function + self.integral = self.Integral(self.f) + self.roots = self.Roots(self.f) + self.edo = self.Edo(self.f) + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + class Integral: + + def __init__(self,function): + self.f = function + self.simple = self.Simple(function) + self.double = self.Double(function) + + class Simple: + def __init__(self, function): + self.f = function + + def riemann(self,a,b,n=None): + + if n is None: + n = 10**6 + + delta = (b-a)/n + + psi = a + theta = 0 + + while((psi+delta) <= b): + + theta += (self.f(psi) + self.f(psi + delta))/2 + psi += delta + + integral = delta*theta + + return integral + + def simpson(self,a,b,n=None): + + if n is None: + n = 10**6 + + def x(i): + return a + i*h + + h = (b-a)/n + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta = eta + self.f(x(2*psi - 1)) + psi = psi + 1 + + while(kappa <= ((n/2)-1)): + + theta = theta + self.f(x(2*kappa)) + kappa = kappa + 1 + + return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) + + + class Double: + + def __init__(self,function): + self.f = function + + def riemann(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + kappa = a + psi = c + theta = 0 + + while((psi + dy) < d): + + while((kappa + dx) < b): + + theta = theta + self.f(kappa, psi) + kappa = kappa + dx + + psi = psi + dy + kappa = a + + return theta*(dx)*(dy) + + def simpson(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + + def x(i): + + x = a + i*dx + + return x + + def y(i): + + y = c + i*dy + + return y + + def g(i): + + sigma = 0 + upsilon = 0 + + zeta = 1 + csi = 1 + + while(zeta <= (m/2)): + + sigma += self.f(x(i),y(2*zeta - 1)) + zeta += 1 + + while(csi <= ((m/2)-1)): + + upsilon += self.f(x(i),y(2*csi)) + csi += 1 + + return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta += g(2*psi - 1) + psi += 1 + + while(kappa <= ((n/2)-1)): + + theta += g(2*kappa) + kappa += 1 + + return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) + + class Roots: + + def __init__(self, function=None): + if function is not None: + self.f = function + + def bissec(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + while abs(a-b) > e: + + c = (a+b)/2 + fc = self.f(c) + + if (fa*fc) < 0: + + b = c + + else: + + a = c + fa = fc + + c = (a+b)/2 + + return c + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + def newton(self,a,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + da = self.d(a,e) + b = a - fa/da + + + while abs(a-b) > e: + + b = a + a -= (fa/da) + fa = self.f(a) + da = self.d(a,e) + + return a + + def bissec_newton(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + c = (a+b)/2 # 'c' é a raiz calculada + + while abs(a-b) > 0.1: + + fc = self.f(c) + + if fa*fc < 0: + + b = c + + else: + + a = c + fa = self.f(a) + + c = (a+b)/2 + + fc = self.f(c) + dc = self.d(c,e) + h = c - fc/dc # 'h' é uma variável de controle + + while abs(c-h) > e: + + h = c + c -= (fc/dc) + fc = self.f(c) + dc = self.d(c,e) + + return (c) + + + class Edo: + + def __init__(self, function): + self.F = function + + def euler(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return a + i*dx + + for i in range(n): + + y = y + (self.F(x(i),y))*dx + + return y + + def runge(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) + + return y + + def adams(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + f0 = self.F(x(i),y) + f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) + f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) + + y += (dx/12)*(5*f2 + 8*f1 - f0) + + return y + +class Interpolation: + """ Data should be organized in two columns: X and Y""" + + def __init__(self, data): + + self.data = data + self.polinomial = self.Polinomial(self.data) + + def minimus(self,x): + + theta = 0 + # somatorio de x + for i in range(self.data.shape[0]): + + theta += self.data.x[i] + + eta = 0 + #somatorio de y + for i in range(self.data.shape[0]): + + eta += self.data.y[i] + + sigma = 0 + #somatorio de xy + for i in range(self.data.shape[0]): + + sigma += self.data.x[i]*self.data.y[i] + + omega = 0 + #somatorio de x^2self.dself.dself.d + for i in range(self.data.shape[0]): + + omega += self.data.x[i]**2 + + + self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) + + self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) + + ym = 0 + + for i in range(self.data.shape[0]): + + ym += self.data.y[i]/self.data.shape[0] + + sqreq = 0 + + for i in range(self.data.shape[0]): + + sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 + + sqtot = 0 + + for i in range(self.data.shape[0]): + + sqtot += (self.data.y[i] - ym)**2 + + self.r2 = sqreq/sqtot + + return self.a*x + self.b + + class Polinomial: + + def __init__(self, data): + self.data = data + + def vandermonde(self, x): + + matrix = np.zeros((self.data.shape[0],self.data.shape[0])) + + for k in range(0, self.data.shape[0]): + + matrix[:,k] = self.data.x[:]**k + + self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) + + y = 0 + + for i in range(0,self.A.shape[0]): + + y += self.A[i]*(x**i) + + return float(y) + + def lagrange(self, x): + + def L(k,x): + + up = down = 1 + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + up = up*(x - self.data.x[i]) + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + down = down*(self.data.x[k] - self.data.x[i]) + + return up/down + + y = 0 + + for i in range(self.data.x.shape[0]): + + y += self.data.y[i]*L(i,x) + + return y + + def newton(self,x): + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) + j += 1 + + i += 1 + j = 0 + + def f(x): + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y + + self.f = f + + return f(x) + + def gregory(self,x): + + h = self.data.x[0] - self.data.x[1] + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) + j += 1 + + i += 1 + j = 0 + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y \ No newline at end of file diff --git a/Source Code - Otter/__init__.py b/Source Code - Otter/__init__.py new file mode 100644 index 0000000..08ce1fe --- /dev/null +++ b/Source Code - Otter/__init__.py @@ -0,0 +1,21 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. + +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from .Otter import Algebra as algebra +from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/yoshi-otter1.3.3.tar.xz b/yoshi-otter1.3.3.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..efe85e1825d2449b701774b9e31ad15245f8e9de GIT binary patch literal 27976 zcmV(*K;FOoH+ooF000E$*0e?f03iVu0001VFXf}*SO0AVT>w0r%FQABDvnSlj#72Q z3ecdRjLp-+JKGBXWr=MsgTP~TEq7YH3URWi;a4|=`TpKyt&X>yT9V;`+KafNn`f*& zzu}$A7K}*#?oHXIvToSgyz+FTBX~b-y+^cv6d=5LnaI^LaXPCh{K6XvO)kq z<8pi~3$Rwrtd>cW*hRz*IlW?H` zY&MOw&(Z79!xykR1hrIDyNk1UZrM(;rG~B%Yunn_8(Cq(1?Kwd$LlRK4X{AWn!Vu+ zBz0qITHImZqQxpM0TB0%l=%PH^>(15+k&a=u)3O8h0!}8iwr=ZN+BYZ9< zlHU4eflQb#fp0)&EnoxXp)ci?AT&TNX{Ru^T=D>i#aIW%mIGbzE3uax=*xN!S?G#O zW#MI5fgy|BUn}Z4>TNY&Gpj)r;?4TFP+Wo4<-FQN1GaKRsFWLaKZh z2-GawoA!FTf5V?sR`PRqA^jn%hR=Q0Bx50%^yL9qmk!P4xCWjAR@iELOrpEvPp_Gf ztm**BZt<_UJ6xU%*k2t-)BIc9!{`Q2u@6A1eQ1utzrC7Uym%+$&16swLDF=q6-CzXs5dKD_QLhm9bDDPSQsWS@g((&@L3{rL>as{%b?n2wIXn z@SLnnsX1gAlVj#llQ0<0V@_d9GA-zy8ElkF4l>6xMg4(-VdyUOw^slS$^J2}^__d& zUxmG*q74nS!{J(}8X9w&p9b%9%FCo^D1cP}{p4D>;bsG;n-Fv1vL-b@g$}qAj2;!c{U<0m{B<7z%TC$S98IkGPgtBYq$J3Bp9ADRc>99GlEs^< zg3z)@LAY619YOs}io#$xkq|HzWSb9FFD7&sWvow=_fK<}9Nc1Zkxs0$mq z9+~mPYSgYt!C?$Ff(&wYL)(N zk)V_afzq}tK!p~Sq1BxQ5^q%6B2;}EkbH4DjC-h&b|#&9Mx3=rqSS-Yd9cQR_O1T{ z+4|E!c@~N%cW4vs{V5!;c5W#wwv);yJ5+0XRZNNLTaK$nVTzY~thqj7>4|kEAkmrS z+bEXS$gH7H)Mu1mV0w&PA`#<{uc}$oCLVvcc`ab<)@v&&q4ATHJ+CQ}t`1uM$& zS49o;(XM=p?K5OLii(msyTs)Gb$mDwW(gmc#gAgrRQx0 z?=SA^)ZFFv79fS6XqdfEO)rZ(ngbyh?q~C{VmdB1@ir<^W0wU`ZJ~yYyB^PZ>3WO_ zVU*{hkBe5?_ICdw_+J*tamZ3%e)LU;7TDw--xt{_W)#ikDt*^*Pp=LiauK4D3xjd~ zE8#~2Jb2N*Fu@P3!+SchH!MjOKI7+lyr$G%ti<~vfybcMTKLknfLwNTgh~{_HQ?PI zQ`s3T>_N4=qvSwpC;o$0(FW1WDl3~Ir$}bevekYu?SHB+)cPIk|1750Lz1T`XHlHc zh)27eF3ve=(xV$3&FZdJV;qe}s~rS+!N{k}(}YsLG2Df(ubp%3z-_bktPe$bnOWyn z#!i6PBq2vxM~mI6zTfiVSJsdKQa!CH`YG8SE&N9%?{rZoJgjBGkN$smg<szG+mi=p4xD%TP zNKHDLgfa?ZQuu(aLXSak->MO>SSEFav>=fZyRL>ahzD&`EsOOl=3h9)4V?BcwcE>~ znU?zN#s=gpnt&S*@|Nefeqbg=kpole_`pay6I%;p0()osz#I@?YQ>&w)cG#bg~Af{=9H+1&%n; z_Sq?RWFdHZn$%%ydweiEg|Z6zPCf3Zj)^uA|MQw3rhWYYCxC3=Laj+h1`H%$1>(?e z6gKYjzy~}11Z*q3?(`bfoIGJ9W4N^#V!K8;Jw<~>8`OTXei2?5=(trx`B0v_i#l?4t1jU?7|82k{W2HU5qan|lphQ9qpX%u>!44o zWpSpXqXN*Udul}AIH*%_K?a{a*gmHIFX*>)TIeJrvIh7RFQN=30zf)N=(Tq2

?Q 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 PvBYQl0ssI200dcDUfyh_ literal 0 HcmV?d00001 diff --git a/yoshi-otter1.3.3/LICENSE b/yoshi-otter1.3.3/LICENSE new file mode 100644 index 0000000..d2c5abe --- /dev/null +++ b/yoshi-otter1.3.3/LICENSE @@ -0,0 +1,278 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. \ No newline at end of file diff --git a/yoshi-otter1.3.3/Otter/Otter.py b/yoshi-otter1.3.3/Otter/Otter.py new file mode 100755 index 0000000..6a91ddc --- /dev/null +++ b/yoshi-otter1.3.3/Otter/Otter.py @@ -0,0 +1,515 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. +# +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import math +import numpy as np +import pandas as pd +from Seals import process as sl + +class Algebra: + + def __init__(self, function): + self.f = function + self.integral = self.Integral(self.f) + self.roots = self.Roots(self.f) + self.edo = self.Edo(self.f) + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + class Integral: + + def __init__(self,function): + self.f = function + self.simple = self.Simple(function) + self.double = self.Double(function) + + class Simple: + def __init__(self, function): + self.f = function + + def riemann(self,a,b,n=None): + + if n is None: + n = 10**6 + + delta = (b-a)/n + + psi = a + theta = 0 + + while((psi+delta) <= b): + + theta += (self.f(psi) + self.f(psi + delta))/2 + psi += delta + + integral = delta*theta + + return integral + + def simpson(self,a,b,n=None): + + if n is None: + n = 10**6 + + def x(i): + return a + i*h + + h = (b-a)/n + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta = eta + self.f(x(2*psi - 1)) + psi = psi + 1 + + while(kappa <= ((n/2)-1)): + + theta = theta + self.f(x(2*kappa)) + kappa = kappa + 1 + + return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) + + + class Double: + + def __init__(self,function): + self.f = function + + def riemann(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + kappa = a + psi = c + theta = 0 + + while((psi + dy) < d): + + while((kappa + dx) < b): + + theta = theta + self.f(kappa, psi) + kappa = kappa + dx + + psi = psi + dy + kappa = a + + return theta*(dx)*(dy) + + def simpson(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + + def x(i): + + x = a + i*dx + + return x + + def y(i): + + y = c + i*dy + + return y + + def g(i): + + sigma = 0 + upsilon = 0 + + zeta = 1 + csi = 1 + + while(zeta <= (m/2)): + + sigma += self.f(x(i),y(2*zeta - 1)) + zeta += 1 + + while(csi <= ((m/2)-1)): + + upsilon += self.f(x(i),y(2*csi)) + csi += 1 + + return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta += g(2*psi - 1) + psi += 1 + + while(kappa <= ((n/2)-1)): + + theta += g(2*kappa) + kappa += 1 + + return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) + + class Roots: + + def __init__(self, function=None): + if function is not None: + self.f = function + + def bissec(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + while abs(a-b) > e: + + c = (a+b)/2 + fc = self.f(c) + + if (fa*fc) < 0: + + b = c + + else: + + a = c + fa = fc + + c = (a+b)/2 + + return c + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + def newton(self,a,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + da = self.d(a,e) + b = a - fa/da + + + while abs(a-b) > e: + + b = a + a -= (fa/da) + fa = self.f(a) + da = self.d(a,e) + + return a + + def bissec_newton(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + c = (a+b)/2 # 'c' é a raiz calculada + + while abs(a-b) > 0.1: + + fc = self.f(c) + + if fa*fc < 0: + + b = c + + else: + + a = c + fa = self.f(a) + + c = (a+b)/2 + + fc = self.f(c) + dc = self.d(c,e) + h = c - fc/dc # 'h' é uma variável de controle + + while abs(c-h) > e: + + h = c + c -= (fc/dc) + fc = self.f(c) + dc = self.d(c,e) + + return (c) + + + class Edo: + + def __init__(self, function): + self.F = function + + def euler(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return a + i*dx + + for i in range(n): + + y = y + (self.F(x(i),y))*dx + + return y + + def runge(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) + + return y + + def adams(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + f0 = self.F(x(i),y) + f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) + f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) + + y += (dx/12)*(5*f2 + 8*f1 - f0) + + return y + +class Interpolation: + """ Data should be organized in two columns: X and Y""" + + def __init__(self, data): + + self.data = data + self.polinomial = self.Polinomial(self.data) + + def minimus(self,x): + + theta = 0 + # somatorio de x + for i in range(self.data.shape[0]): + + theta += self.data.x[i] + + eta = 0 + #somatorio de y + for i in range(self.data.shape[0]): + + eta += self.data.y[i] + + sigma = 0 + #somatorio de xy + for i in range(self.data.shape[0]): + + sigma += self.data.x[i]*self.data.y[i] + + omega = 0 + #somatorio de x^2self.dself.dself.d + for i in range(self.data.shape[0]): + + omega += self.data.x[i]**2 + + + self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) + + self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) + + ym = 0 + + for i in range(self.data.shape[0]): + + ym += self.data.y[i]/self.data.shape[0] + + sqreq = 0 + + for i in range(self.data.shape[0]): + + sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 + + sqtot = 0 + + for i in range(self.data.shape[0]): + + sqtot += (self.data.y[i] - ym)**2 + + self.r2 = sqreq/sqtot + + return self.a*x + self.b + + class Polinomial: + + def __init__(self, data): + self.data = data + + def vandermonde(self, x): + + matrix = np.zeros((self.data.shape[0],self.data.shape[0])) + + for k in range(0, self.data.shape[0]): + + matrix[:,k] = self.data.x[:]**k + + self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) + + y = 0 + + for i in range(0,self.A.shape[0]): + + y += self.A[i]*(x**i) + + return float(y) + + def lagrange(self, x): + + def L(k,x): + + up = down = 1 + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + up = up*(x - self.data.x[i]) + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + down = down*(self.data.x[k] - self.data.x[i]) + + return up/down + + y = 0 + + for i in range(self.data.x.shape[0]): + + y += self.data.y[i]*L(i,x) + + return y + + def newton(self,x): + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) + j += 1 + + i += 1 + j = 0 + + def f(x): + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y + + self.f = f + + return f(x) + + def gregory(self,x): + + h = self.data.x[0] - self.data.x[1] + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) + j += 1 + + i += 1 + j = 0 + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y \ No newline at end of file diff --git a/yoshi-otter1.3.3/Otter/__init__.py b/yoshi-otter1.3.3/Otter/__init__.py new file mode 100644 index 0000000..08ce1fe --- /dev/null +++ b/yoshi-otter1.3.3/Otter/__init__.py @@ -0,0 +1,21 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. + +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from .Otter import Algebra as algebra +from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/yoshi-otter1.3.3/README.md b/yoshi-otter1.3.3/README.md new file mode 100644 index 0000000..167eb4e --- /dev/null +++ b/yoshi-otter1.3.3/README.md @@ -0,0 +1,75 @@ +# Otter - Numeric Calculus + +This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: + +* Receive one variable function from user input + +* Receive two variable function from user input + +* Performe derivatives with one variable functions + +* Performe integral with received functions + +* Use methods to proccess the matrices. + +* Find root of functions throw method of bissection and method of newton + +* Solve Diferential Equations throw method of euler and runge + +* Performe Minimus Interpolation and Polinomial Interpolation + +## Syntax + +To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. + +To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. + +### Algebra + +Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). + +#### Integral + +To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. + +After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. + +The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. + +If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. + +#### Roots + +To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. + +The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. + +The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. + +If `e` is not defined the standart value is 10^(-6). + +#### Diferential Equations + +To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. + +The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. + +If `n` is not defined the standart value is 10^7. + +### Interpolation + +The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. + +To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. + +To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. + +## Installation + +To install the package from source `cd` into the directory and run: + +`pip install .` + +or run + +`pip install yoshi-otter` diff --git a/yoshi-otter1.3.3/build/lib/Otter/Otter.py b/yoshi-otter1.3.3/build/lib/Otter/Otter.py new file mode 100644 index 0000000..6a91ddc --- /dev/null +++ b/yoshi-otter1.3.3/build/lib/Otter/Otter.py @@ -0,0 +1,515 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. +# +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import math +import numpy as np +import pandas as pd +from Seals import process as sl + +class Algebra: + + def __init__(self, function): + self.f = function + self.integral = self.Integral(self.f) + self.roots = self.Roots(self.f) + self.edo = self.Edo(self.f) + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + class Integral: + + def __init__(self,function): + self.f = function + self.simple = self.Simple(function) + self.double = self.Double(function) + + class Simple: + def __init__(self, function): + self.f = function + + def riemann(self,a,b,n=None): + + if n is None: + n = 10**6 + + delta = (b-a)/n + + psi = a + theta = 0 + + while((psi+delta) <= b): + + theta += (self.f(psi) + self.f(psi + delta))/2 + psi += delta + + integral = delta*theta + + return integral + + def simpson(self,a,b,n=None): + + if n is None: + n = 10**6 + + def x(i): + return a + i*h + + h = (b-a)/n + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta = eta + self.f(x(2*psi - 1)) + psi = psi + 1 + + while(kappa <= ((n/2)-1)): + + theta = theta + self.f(x(2*kappa)) + kappa = kappa + 1 + + return (h/3)*( self.f(x(0)) + self.f(x(n)) + 4*eta + 2*theta) + + + class Double: + + def __init__(self,function): + self.f = function + + def riemann(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + kappa = a + psi = c + theta = 0 + + while((psi + dy) < d): + + while((kappa + dx) < b): + + theta = theta + self.f(kappa, psi) + kappa = kappa + dx + + psi = psi + dy + kappa = a + + return theta*(dx)*(dy) + + def simpson(self,a,b,c,d,n=None,m=None): + + if n is None: + n = 10**4 + + if m is None: + m = n + + dx = (b-a)/n + dy = (d-c)/m + + def x(i): + + x = a + i*dx + + return x + + def y(i): + + y = c + i*dy + + return y + + def g(i): + + sigma = 0 + upsilon = 0 + + zeta = 1 + csi = 1 + + while(zeta <= (m/2)): + + sigma += self.f(x(i),y(2*zeta - 1)) + zeta += 1 + + while(csi <= ((m/2)-1)): + + upsilon += self.f(x(i),y(2*csi)) + csi += 1 + + return (dy/3)*( self.f(x(i),y(0)) + self.f(x(i),y(m)) + 4*sigma + 2*upsilon ) + + eta = 0 + theta = 0 + + psi = 1 + kappa = 1 + + while(psi <= (n/2)): + + eta += g(2*psi - 1) + psi += 1 + + while(kappa <= ((n/2)-1)): + + theta += g(2*kappa) + kappa += 1 + + return (dx/3)*( g(0) + g(n) + 4*eta + 2*theta) + + class Roots: + + def __init__(self, function=None): + if function is not None: + self.f = function + + def bissec(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + while abs(a-b) > e: + + c = (a+b)/2 + fc = self.f(c) + + if (fa*fc) < 0: + + b = c + + else: + + a = c + fa = fc + + c = (a+b)/2 + + return c + + def d(self, x, e): + return (self.f(x + e) - self.f(x - e))/(2*e) + + def newton(self,a,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + da = self.d(a,e) + b = a - fa/da + + + while abs(a-b) > e: + + b = a + a -= (fa/da) + fa = self.f(a) + da = self.d(a,e) + + return a + + def bissec_newton(self,a,b,e=None): + + if e is None: + e = 10**(-6) + + fa = self.f(a) + + c = (a+b)/2 # 'c' é a raiz calculada + + while abs(a-b) > 0.1: + + fc = self.f(c) + + if fa*fc < 0: + + b = c + + else: + + a = c + fa = self.f(a) + + c = (a+b)/2 + + fc = self.f(c) + dc = self.d(c,e) + h = c - fc/dc # 'h' é uma variável de controle + + while abs(c-h) > e: + + h = c + c -= (fc/dc) + fc = self.f(c) + dc = self.d(c,e) + + return (c) + + + class Edo: + + def __init__(self, function): + self.F = function + + def euler(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return a + i*dx + + for i in range(n): + + y = y + (self.F(x(i),y))*dx + + return y + + def runge(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + y = y + (dx/2)*(self.F(x(i),y)+self.F(x(i+1),(y+(dx*self.F(x(i),y))))) + + return y + + def adams(self,a,y,b,n=None): + + if n is None: + n = 10**6 + + dx = (b-a)/n + + def x(i): + return (a + i*dx) + + for i in range(n): + + f0 = self.F(x(i),y) + f1 = self.F(x(i+1),y + dx*self.F(x(i)+(dx/2),y+(dx/2)*self.F(x(i),y))) + f2 = self.F(x(i+2),y + (dx/2)*(3*f1-f0)) + + y += (dx/12)*(5*f2 + 8*f1 - f0) + + return y + +class Interpolation: + """ Data should be organized in two columns: X and Y""" + + def __init__(self, data): + + self.data = data + self.polinomial = self.Polinomial(self.data) + + def minimus(self,x): + + theta = 0 + # somatorio de x + for i in range(self.data.shape[0]): + + theta += self.data.x[i] + + eta = 0 + #somatorio de y + for i in range(self.data.shape[0]): + + eta += self.data.y[i] + + sigma = 0 + #somatorio de xy + for i in range(self.data.shape[0]): + + sigma += self.data.x[i]*self.data.y[i] + + omega = 0 + #somatorio de x^2self.dself.dself.d + for i in range(self.data.shape[0]): + + omega += self.data.x[i]**2 + + + self.a = (self.data.shape[0]*sigma - theta*eta)/(self.data.shape[0]*omega - (theta**2)) + + self.b = (theta*sigma - eta*omega)/((theta**2) - self.data.shape[0]*omega) + + ym = 0 + + for i in range(self.data.shape[0]): + + ym += self.data.y[i]/self.data.shape[0] + + sqreq = 0 + + for i in range(self.data.shape[0]): + + sqreq += ((self.a*self.data.x[i] + self.b) - ym)**2 + + sqtot = 0 + + for i in range(self.data.shape[0]): + + sqtot += (self.data.y[i] - ym)**2 + + self.r2 = sqreq/sqtot + + return self.a*x + self.b + + class Polinomial: + + def __init__(self, data): + self.data = data + + def vandermonde(self, x): + + matrix = np.zeros((self.data.shape[0],self.data.shape[0])) + + for k in range(0, self.data.shape[0]): + + matrix[:,k] = self.data.x[:]**k + + self.A = sl.gauss(np.c_[matrix,self.data[:,1]]) + + y = 0 + + for i in range(0,self.A.shape[0]): + + y += self.A[i]*(x**i) + + return float(y) + + def lagrange(self, x): + + def L(k,x): + + up = down = 1 + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + up = up*(x - self.data.x[i]) + + for i in [x for x in range(self.data.x.shape[0]) if x != k]: + down = down*(self.data.x[k] - self.data.x[i]) + + return up/down + + y = 0 + + for i in range(self.data.x.shape[0]): + + y += self.data.y[i]*L(i,x) + + return y + + def newton(self,x): + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/(self.data.x[(i+1)+j]-self.data.x[j]) + j += 1 + + i += 1 + j = 0 + + def f(x): + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y + + self.f = f + + return f(x) + + def gregory(self,x): + + h = self.data.x[0] - self.data.x[1] + + d = np.array(np.zeros((self.data.shape[0],self.data.shape[0]))) + + d[0] = self.data.y + + i = j = 0 + + while (i < self.data.shape[0]): + + while (j < (self.data.shape[0]-(i+1))): + + d[i+1][j] = (d[i][j+1] - d[i][j])/((i+1)*h) + j += 1 + + i += 1 + j = 0 + + y = d[0][0] + i = 0 + + while ((i+1) < self.data.shape[0]): + + mult = 1 + k = 0 + while (k <= i): + mult = mult*(x - self.data.x[k]) + k += 1 + + y += d[i+1][0]*mult + i += 1 + + return y \ No newline at end of file diff --git a/yoshi-otter1.3.3/build/lib/Otter/__init__.py b/yoshi-otter1.3.3/build/lib/Otter/__init__.py new file mode 100644 index 0000000..08ce1fe --- /dev/null +++ b/yoshi-otter1.3.3/build/lib/Otter/__init__.py @@ -0,0 +1,21 @@ +# Otter - Program made for educational intent, can be freely distributed +# and can be used for economical intent. I will not take legal actions +# unless my intelectual propperty, the code, is stolen or change without permission. + +# Copyright (C) 2020 VItor Hideyoshi Nakazone Batista + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +from .Otter import Algebra as algebra +from .Otter import Interpolation as interpolation \ No newline at end of file diff --git a/yoshi-otter1.3.3/dist/yoshi-otter-1.3.3.tar.gz b/yoshi-otter1.3.3/dist/yoshi-otter-1.3.3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1c8cb116de7975b37792249b2ae533876b6537d8 GIT binary patch literal 5813 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 Gy!{_y3O%_1 literal 0 HcmV?d00001 diff --git a/yoshi-otter1.3.3/setup.py b/yoshi-otter1.3.3/setup.py new file mode 100644 index 0000000..6c02dea --- /dev/null +++ b/yoshi-otter1.3.3/setup.py @@ -0,0 +1,28 @@ +import setuptools + +with open("README.md", "r") as fh: + long_description = fh.read() + +setuptools.setup( + name="yoshi-otter", # Replace with your own username + version="1.3.3", + author="Vitor Hideyoshi", + author_email="vitor.h.n.batista@gmail.com", + description="Numeric Calculus python module in the topic of Algebra Functions", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git", + packages=setuptools.find_packages(), + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", + "Operating System :: OS Independent", + "Development Status :: 2 - Pre-Alpha", + ], + python_requires='>=3.6', + install_requires=[ + 'numpy', + 'pandas', + 'yoshi-seals' + ], +) \ No newline at end of file diff --git a/yoshi-otter1.3.3/yoshi_otter.egg-info/PKG-INFO b/yoshi-otter1.3.3/yoshi_otter.egg-info/PKG-INFO new file mode 100644 index 0000000..36a6cec --- /dev/null +++ b/yoshi-otter1.3.3/yoshi_otter.egg-info/PKG-INFO @@ -0,0 +1,91 @@ +Metadata-Version: 2.1 +Name: yoshi-otter +Version: 1.3.3 +Summary: Numeric Calculus python module in the topic of Algebra Functions +Home-page: https://github.com/HideyoshiNakazone/Otter-NumericCalculus.git +Author: Vitor Hideyoshi +Author-email: vitor.h.n.batista@gmail.com +License: UNKNOWN +Description: # Otter - Numeric Calculus + + This python package is made for applied Numeric Calculus of Algebra Functions. It is made with the following objectives in mind: + + * Receive one variable function from user input + + * Receive two variable function from user input + + * Performe derivatives with one variable functions + + * Performe integral with received functions + + * Use methods to proccess the matrices. + + * Find root of functions throw method of bissection and method of newton + + * Solve Diferential Equations throw method of euler and runge + + * Performe Minimus Interpolation and Polinomial Interpolation + + ## Syntax + + To initialize a Otter instance linked to functions use the following syntax `otr = Otter.algebra(f)`, where `otr` will be a arbitrary name for the instance and `f` is a function of *one variable*. + + To initialize a Otter instance linked to data and interpolation use the following syntax `otr = Otter.interpolation(data)`, where `otr` will be a arbitrary name for the instance and data will be a *numpy* matrix where the first columns has to contain the values for `x` and the second column contains the values for `y`. + + ### Algebra + + Algebra is a Python Class where some of the features described previously are defined as Classes as well, like: `Integral`, `Roots`, `EDO` (diferential equations). + + #### Integral + + To call the class *Integral* append the sufix with lower case in front of the instance like: `otr.integral`. The Integral class has two other class defined inside, `Simple` and `Double`, to call them append the sufix with lower case in front as `otr.integral.simple` or `otr.integral.double`. Then pick between Riemann's Method or Simpson's Method by appending the sufix `riemann` or `simpson` as well. + + After that the syntax will be something like `otr.integral.double.riemann(a,b,c,d,n,m)`, where `a` and `c` will be the first value of the interval of integration respectively in x and y, `b` and `d` will be the last, `n` and `m` will be the number of partitions. + + The syntax for one variable integrations will be `otr.integral.simple.riemann(a,b,n)`. + + If `n` is not defined the standart value in 10^6 partitions for one variable and 10^4 for double. And if `m` is not defined the standart value will be equal to `n`. + + #### Roots + + To call the class *Root* append the sufix with lower case in front of the instance like: `otr.roots`. The Roots class has three methods defined inside, `bissec`, `newton` and `bissec_newton`, to call them append the sufix with lower case in front as `otr.roots.bissec` or `otr.roots.newton` or even `otr.roots.bissecnewton`. + + The syntax for the bissection method and bissec_newton is equal to `otr.roots.bissec(a,b,e)` and `otr.roots.bissec_newton(a,b,e)`, where `a` is the first element of the interval containing the root and `b` is the last, `e` being the precision. + + The syntax for the newton method is equal to `otr.roots.newton(a,e)`, where `a` is the element closest to the root and `e` is the precision. + + If `e` is not defined the standart value is 10^(-6). + + #### Diferential Equations + + To call the class *EDO* (*E*quações *D*iferenciais *O*rdinárias) append the sufix with lower case in front of the instance like: `otr.edo`. The *EDO* class has two methods defined inside: `euler` and `runge`, to call them append the sufix with lower case in front as `otr.edo.euler` or `otr.edo.runge`. + + The syntax for the diferential equations method is equal to `otr.edo.euler(a,y,b,n)` or `otr.edo.runge(a,y,b,n)`, where `a` and `y` will be the inintial point and `b` is the value in *x* which you want to know the corresponding value in *y* and `n` is the number of operations. + + If `n` is not defined the standart value is 10^7. + + ### Interpolation + + The python class *Interpolation* is divided in one method, minimus interpolation, and one class, polinomial interpolation. + + To call the method *minimus* use a syntax like `otr = Otter.interpolation(data)`, where `data` is a data frame containing values for *x* and *y*, `otr` is an instance and append the method in front of the instance like: `otr.minimus(x)`, where *x* is value of *f(x)* you want to estimate. + + To call the class *Polinomial* append the sufix with lower case in front of the instance like: `otr.polinomial`. The *Polinomial* class has four methods defined inside: `vandermonde`, `lagrange`, `newton` and `gregory`, to call them append the sufix with lower case in front like `otr.edo.gregory(x)` where *x* is value of *f(x)* you want to estimate. + + ## Installation + + To install the package from source `cd` into the directory and run: + + `pip install .` + + or run + + `pip install yoshi-otter` + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2) +Classifier: Operating System :: OS Independent +Classifier: Development Status :: 2 - Pre-Alpha +Requires-Python: >=3.6 +Description-Content-Type: text/markdown diff --git a/yoshi-otter1.3.3/yoshi_otter.egg-info/SOURCES.txt b/yoshi-otter1.3.3/yoshi_otter.egg-info/SOURCES.txt new file mode 100644 index 0000000..5dc205c --- /dev/null +++ b/yoshi-otter1.3.3/yoshi_otter.egg-info/SOURCES.txt @@ -0,0 +1,9 @@ +README.md +setup.py +Otter/Otter.py +Otter/__init__.py +yoshi_otter.egg-info/PKG-INFO +yoshi_otter.egg-info/SOURCES.txt +yoshi_otter.egg-info/dependency_links.txt +yoshi_otter.egg-info/requires.txt +yoshi_otter.egg-info/top_level.txt \ No newline at end of file diff --git a/yoshi-otter1.3.3/yoshi_otter.egg-info/dependency_links.txt b/yoshi-otter1.3.3/yoshi_otter.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/yoshi-otter1.3.3/yoshi_otter.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/yoshi-otter1.3.3/yoshi_otter.egg-info/requires.txt b/yoshi-otter1.3.3/yoshi_otter.egg-info/requires.txt new file mode 100644 index 0000000..11c1c26 --- /dev/null +++ b/yoshi-otter1.3.3/yoshi_otter.egg-info/requires.txt @@ -0,0 +1,3 @@ +numpy +pandas +yoshi-seals diff --git a/yoshi-otter1.3.3/yoshi_otter.egg-info/top_level.txt b/yoshi-otter1.3.3/yoshi_otter.egg-info/top_level.txt new file mode 100644 index 0000000..ccaaf54 --- /dev/null +++ b/yoshi-otter1.3.3/yoshi_otter.egg-info/top_level.txt @@ -0,0 +1 @@ +Otter