SymPy: Warum funktioniert hier das Vereinfachen eines mathematischen Ausdrucks nicht?

Ich schaue mir gerade das Python-Modul SymPy an und versuche mich als erstes Beispiel im fitten einer Funktion f(x) durch ein Funktionsset (fi,) in einem gegebenen Intervall.

Es soll als Ergebnis die gefittete Funktion u(x) herauskommen:



import sympy as sym

def functionFit(f, funcset, interval):
  N = len(funcset) - 1
  A = sym.zeros(N + 1, N + 1)
  b = sym.zeros(N + 1, 1)
  x = sym.Symbol('x')

  for i in range(N + 1):
    for j in range(i, N + 1):
      A[i, j] = sym.integrate(
        funcset[i] * funcset[j],
        (x, interval[0], interval[1]))
      A[j, i] = A[i, j]

    b[i, 0] = sym.integrate(funcset[i] * f, (x, interval[0], interval[1]))

  c = A.LUsolve(b)
  u = 0

  for i in range(len(funcset)):
    u += c[i, 0] * funcset[i]

  return u, c

x = sym.Symbol('x')
f = 10 * sym.cos(x) + 3 * sym.sin(x)
fooset = (sym.sin(x), sym.cos(x))
interval = (1, 2)

print("function to approximate:", f)
print("Basic functions:")

for foo in fooset:
  print(" - ", foo)

u,c = functionFit(f, fooset, interval)

print()
print("simplified u:")
print(sym.simplify(u))
print()
print("simplified c:")
print(sym.simplify(c))  

Wenn ich dieses simple Beispiel laufen lasse, erhalte ich:

function to approximate: 10 * cos(x)
Basic functions:
  - sin(x)
  - cos(x)
simplified u: 10 * cos(x)

simplified c:
Matrix([[0], [10]])

womit ich zufrieden bin.

Setze ich aber

f = 10sym.cos(x) + 3sym.cos(x)

dann erhalte ich:

function to approximate: 3sin(x) + 10cos(x)
Basic functions:
 - sin(x)
 - cos(x)
simplified u: (12sin(2)2sin(4)sin(x) + 3sin(8)sin(x) + 12sin(2)sin(x) + 40sin(2)*2sin(4)cos(x) + 10sin(8)cos(x) + 40sin(2)cos(x))/(2(sin(4) + 2*sin(2)))

simplified c:
Matrix([[3], [10]])

Der Ausdruck für u ist natürlich richtig, aber wieso schafft es SymPy nicht, den Ausdruck auf



zu vereinfachen?

Mache ich hier als Anfänger etwas falsch oder kann ich da nicht mehr erwarten? Dann wäre SymPy aber ziemlich unbrauchbar, wenn es schon bei derart elementaren Dingen versagt.

Als Vergleich: Mathematica reduziert das ausgewiesene u(x) schnell und sauber auf den richtigen Ausdruck. Wenn man mit SymPy schon so etwas nicht richtig hinkriegt, lohnt sich die weitere Beschäftigung damit eigentlich nicht. Ich hoffe inbrünstig, dass ich etwas falsch mache. Ich bitte um Hinweise was das sein könnte!

Computer, Mathematik, Mathe, programmieren, Programmierung, Python
4 Antworten
Wie seht ihr diesen Fall?

Das Österreichischen Ministerium BMVIT (Bundesministerium für Verkehr Innovation und Technologie) steht seit Beginn der letzten Regierung unter blauer Flagge (FPÖ). Angessichts der letzen Vorfälle ist es mittlerweile kein Geheimnis mehr, dass sich selbst sehr prominente Anhänger dieser Partei in ungeniert in rechtsradikalen Kreisen bewegen und mit Aussagen kokettieren, die man zeitlich eher in einer anderen geschichtlichen Periode ansiedeln würde.

Nun bin ich aber doch darüber erstaunt, dass ein hoher Kabinettsmitarbeiter, der direkt Norbert Hofer (dieser ist was die Nähe zum rechten Lager betrifft ja auch nicht gerade unauffällig...) unterstellt ist: Herwig Götschober, zuständig für soziale Medien, hat folgende Durchwahl im BMVIT: 65 8818. 88 und 18 sind Neonazi-Codes, die in der rechten Szene für "Heil Hitler" bzw. "Adolf Hitler" stehen.

Schaut man sich die Liste der anderen Nummern an, so erkennt man, dass diese allesamt nicht die Zahl 88 und 18 beinhalten.

https://www.bmvit.gv.at/ministerium/hofer/personal.html

Wenn man sich nun über den Menschen Götschober informiert, wird man sehr schnell fündig, dass dieser in der braunen Szene kein unbeschriebenes Blatt ist.

Ich würde eine KFZ Nummer mit diesen Zahlen eindeutig zurückbringen - mittlerweile werden auch Wunschkennzeichen mit diesen Zifferkombinationen nicht mehr ausgestellt.

Die Frage:

Ist diese Telefonnummer Zufall? Selbst wenn das wäre, hätte es ja genügend Zeit gegeben, diese zu ändern, da dies wahrlich keine gute Optik hinterlässt, selbst dann, wenn es einfach "passiert" ist. Aufforderungen dazu gab es in der letzten Zeit schon zu Hauf - reagiert hat man aber bisher nicht.

Ist das nicht seltsam?

Politik, fpoe, Gesellschaft, Rechtsradikalismus
4 Antworten
Was bedeutet unter Python die Exception "Only one usage of each socket address is normally permitted"?

Ich habe einen Socket-Server unter Python implementiert:

Zunächst wird für eine gegebene Adreese/Port ein Socket erzeugt,

...
sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking (0)
sock.bind ((self._ipadress, port))
...

weiter hinten arbeite ich in einer Schleife mit select.select und akzeptiere Verbindungen, die auf derart erzeugre Sockets eingehen:

...
readable, writable, exceptional = select.select ([..., sock, ...], [], [])
...
for s in readable:
    dyn_socket = s.accept ()
    ...

Verbindungen können client-seitig geschlossen werden können, wenn sie sie nicht mehr benötigt werden.

Ich habe meinen Code mit einem Python-Client erfolgreich getestet und konnte feststellen, dass mehrere tausend Verbindungen gleichzeitig bearbeitet werden können.

Ich bekomme jedoch sehr sporadisch (alle 10,000 mal beim Aufbau einer Verbindung) einen Fehler:

"Only one usage of each socket address is normally permitted"

Was sagt mir das genau ?

Mehrfache Verbindungen auf demselben Port sind ja auf jeden Fall möglich (ich habe es schließlich getestet...), warum sollte es also nur eine Verbindung über den Socket geben? Dies widerspricht ja dem Prinzip, dass mehrere Clients vom selben Server über den gleichen Port akzeptiert werden können - oder?

Aus

https://stackoverflow.com/questions/12362542/python-server-only-one-usage-of-each-socket-address-is-normally-permitted/37799189

habe ich gesehen, dass der Fehler vermieden werden kann, indem SO_REUSEADDR verwendet wird. Warum ist es das jedoch erforderlich, da der Socket nach dem Schließen einer Verbindung durch einen Client doch noch weitere Verbindungen akzeptieren kann.

Bin jetzt ziemlich verwirrt. Was bringe ich hier durcheinander?

Computer, Technik, Programmierung, Python, TCPIP, Technologie, Socket, Spiele und Gaming
0 Antworten