From a8c5c3a4ebe77a372a991c0fa8a557292fc5ea8e Mon Sep 17 00:00:00 2001 From: hbui <hong-phuc.bui@htwsaar.de> Date: Fri, 19 Jul 2024 01:31:57 +0200 Subject: [PATCH] add RiemannSum Implementierung --- num-int/src/numint/RiemannSum.py | 65 +++++++++++++++++++++ stundenplan/src/pygraph/graphdemo.py | 40 ++++++++----- num-int/src/numint/__init__.py | 0 num-int/test/numint/RiemannSum_test.py | 29 +++++++++ num-int/test/numint/__init__.py | 0 num-int/test/__init__.py | 0 num-int/pyproject.toml | 15 +++++ 7 files changed, 133 insertions(+), 16 deletions(-) diff --git a/num-int/pyproject.toml b/num-int/pyproject.toml new file mode 100644 index 0000000..abc2b36 --- /dev/null +++ b/num-int/pyproject.toml @@ -0,0 +1,15 @@ +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[project] +name = "wettercdc" +version = "0.0.1" + +[tool.setuptools.packages.find] +# All the following settings are optional: +where = ["src"] + +[project.scripts] +numint = "numint.Riemann:main" + diff --git a/num-int/src/numint/RiemannSum.py b/num-int/src/numint/RiemannSum.py new file mode 100644 index 0000000..12febc7 --- /dev/null +++ b/num-int/src/numint/RiemannSum.py @@ -0,0 +1,65 @@ +def split(iteration=8): + (a, b) = (0, 8) + x = [a, b] + parts = 1 + dx = (b - a) + for n in range(1, iteration + 1): + print(n, end=" → ") + parts = 2 * parts + dx = dx / 2 + for i in range(1, parts, 2): + print(i, end=" ") + x.insert(i, a + i * dx) + print("\n ", x) + pass + + +def numint(f, a, b, epsilon=1e-3): + dx = b - a + y = [f(a), f(b)] + s_left = dx * y[0] + s_right = dx * y[1] + (n, parts) = (1, 1) + while abs(s_right - s_left) > epsilon: + x = [a, b] # debug only + parts = 2 * parts + dx = dx / 2 + n += 1 + print(n, " → ", parts) + for i in range(1, parts, 2): + x.insert(i, a + i * dx) # debug only + y.insert(i, f(a + i * dx)) + # print(i, end=" ") + # print() + # print(" ", x) + # print(" ", y) + s_left = sum(y[0:-1]) * dx + s_right = sum(y[1:]) * dx + return s_left, s_right + + +def numint_compact(f, a, b, epsilon=1e-3): + dx = b - a + y_l = f(a) + y_r = f(b) + s_left = dx * y_l + s_right = dx * y_r + (n, parts) = (1, 1) + while abs(s_right - s_left) > epsilon: + parts = 2 * parts + dx = dx / 2 + n += 1 + print(n, " → ", parts) + for i in range(1, parts, 2): + # print(i, end=" ") + y = f(a + i*dx) + y_l += y + y_r += y + print() + # print(" ", x) + # print(" ", y) + s_left = y_l * dx + s_right = y_r * dx + return s_left, s_right + + diff --git a/num-int/src/numint/__init__.py b/num-int/src/numint/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/num-int/src/numint/__init__.py diff --git a/num-int/test/__init__.py b/num-int/test/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/num-int/test/__init__.py diff --git a/num-int/test/numint/RiemannSum_test.py b/num-int/test/numint/RiemannSum_test.py new file mode 100644 index 0000000..6711a7e --- /dev/null +++ b/num-int/test/numint/RiemannSum_test.py @@ -0,0 +1,29 @@ +import sys +import unittest +from numint.RiemannSum import split, numint, numint_compact + + +class RiemannSumTestCase(unittest.TestCase): + + def test_split_interval(self): + split(iteration=6) + + def test_numint(self): + def fn(x) : return x**2 + (a, b) = (0, 2) + (l, r) = numint(fn, a, b) + print(l, r) + pass + + def test_numint_compact(self): + def fn(x) : return x**2 + (a, b) = (0, 2) + (l, r) = numint_compact(fn, a, b, epsilon=1E9 * sys.float_info.epsilon) + print(l, r) + pass + + + + +if __name__ == '__main__': + unittest.main() diff --git a/num-int/test/numint/__init__.py b/num-int/test/numint/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/num-int/test/numint/__init__.py diff --git a/stundenplan/src/pygraph/graphdemo.py b/stundenplan/src/pygraph/graphdemo.py index 202e779..28bf931 100644 --- a/stundenplan/src/pygraph/graphdemo.py +++ b/stundenplan/src/pygraph/graphdemo.py @@ -1,23 +1,23 @@ class Graph: def __init__(self): - self.adjacent: dict[int, set] = {} - self.vertex_attribute: dict[int, dict] = {} + self._adjacent: dict[int, set] = {} + self._vertex_attribute: dict[int, dict] = {} def add_vertex(self, vertex): - if vertex not in self.adjacent: + if vertex not in self._adjacent: if not isinstance(vertex, int): raise TypeError(f"Argument {vertex} is not a valid vertex") - self.adjacent[vertex] = set() + self._adjacent[vertex] = set() pass def add_edge(self, u, v): self.add_vertex(u) self.add_vertex(v) - v_neighbor = self.adjacent[v] + v_neighbor = self._adjacent[v] if u not in v_neighbor: v_neighbor.add(u) - u_neighbor = self.adjacent[u] + u_neighbor = self._adjacent[u] if v not in u_neighbor: u_neighbor.add(v) pass @@ -34,31 +34,31 @@ :param properties: :return: self """ - if vertex not in self.adjacent: + if vertex not in self._adjacent: raise ValueError(f"Graph does not include vertex {vertex}") - old_attributes = self.vertex_attribute[vertex] - self.vertex_attribute[vertex] = old_attributes | properties + old_attributes = self._vertex_attribute[vertex] + self._vertex_attribute[vertex] = old_attributes | properties return self pass def get_attribute(self, vertex): - if vertex in self.adjacent: - return self.vertex_attribute[vertex] + if vertex in self._adjacent: + return self._vertex_attribute[vertex] else: raise ValueError(f"Graph does not include vertex {vertex}") pass def vertices(self): - return self.adjacent.keys() + return self._adjacent.keys() def for_each_vertices(self, action): for v in self.vertices(): action(v) def adjacent_of(self, vertex): - if vertex not in self.adjacent: + if vertex not in self._adjacent: raise ValueError(f"Graph does not include vertex {vertex}") - return self.adjacent.get(vertex) + return self._adjacent.get(vertex) def for_each_edges(self, action): visited_edges: dict[int, set] = {} @@ -76,13 +76,21 @@ adjacent.add(second) action(start, end) + def get_lecture_name(self, vertex): + pass + + def set_lecture_name(self, vertex, name): + pass + def __repr__(self): text = "" - sorted_key = sorted(self.adjacent.keys()) + sorted_key = sorted(self._adjacent.keys()) last_key = sorted_key.pop() - def adjacent_fn(vertex): return "[" + ", ".join( [str(v) for v in self.adjacent[vertex]] ) + "]" + def adjacent_fn(vertex): return "[" + ", ".join([str(v) for v in self._adjacent[vertex]]) + "]" for key in sorted_key: text += f"{key} → {adjacent_fn(key)}\n" text += f"{last_key} → {adjacent_fn(last_key)}" return text + def to_dot(self) -> str: + pass -- Gitblit v1.10.0-SNAPSHOT