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