|
Autor |
Dreieckberechnung mit 2 Winkelhalbierenden und einer Seite |
|
Knaaxx
Senior  Dabei seit: 06.05.2006 Mitteilungen: 2730
 | Beitrag No.40, eingetragen 2023-01-31
|
Hallo ebikerni
Du brauchst Werners Antwort nur ein klein wenig erweitern und das Problem ist weg.
Du führst eine zweite Konstante hh << h ein.
Hier 1:1 in "Python" übersetzt
\sourceon nameDerSprache
"""
Werners Antwort
"""
def w1(wa,wb,a,c0):
n = 0
c = 0
h = 1e-5
hh= 1e-15
while abs(c-c0)>hh and n<100:
c = c0
b = (a+c)*(1-(wb**2/(a*c)))**0.5
g1= b*c*(1-(a/(b+c))**2)-wa**2
b = (a+c+h)*(1-(wb**2/(a*(c+h))))**0.5
g2= b*(c+h)*(1-(a/(b+c+h))**2)-wa**2
c0= c-h*g1/(g2-g1)
n = n+1
print('c = ', c,n,c0)
w1(8,14,20,20)
\sourceoff
|
Profil
|
ebikerni
Aktiv  Dabei seit: 17.10.2020 Mitteilungen: 272
 | Beitrag No.41, vom Themenstarter, eingetragen 2023-02-03
|
Hallo Knaaxx,
Dein schönes Programm erbrachte aber einen Fehler:
wha = 8.0
whb =14.0
a = 20.0
print("wha = ",wha)
print("whb = ",whb)
print("a = ",a)
n=0
h = 1e-5
hh= 1e-15
c0=20.0
print("begin")
while abs(c-c0)>hh and n<100:
c=c0
b = (a+c)*(1-(wb**2/(a*c)))**0.5
g1= b*c*(1-(a/(b+c))**2)-wa**2
b = (a+c+h)*(1-(wb**2/(a*(c+h))))**0.5
g2= b*(c+h)*(1-(a/(b+c+h))**2)-wa**2
c0= c-h*g1/(g2-g1)
n = n+1
print('c = ',c)
print('n = ',n)
print('c0 = ',c0)
wha = 8.0
whb = 14.0
a = 20.0
begin
Traceback (most recent call last):
File "D:\PyWaWbA81420Neu\PyWaWbA81420.py", line 41, in
while abs(c-c0)>hh and n<100:
NameError: name 'c' is not defined
Wie kann das Programm geändert Werden ?
Gruß ebikerni
|
Profil
|
Knaaxx
Senior  Dabei seit: 06.05.2006 Mitteilungen: 2730
 | Beitrag No.42, eingetragen 2023-02-03
|
Hallo,
na ja, ich sag mal du hast "angepasst" und unterschlagen. Was denkst warum "c = 0" bei mir oben aufgeführt ist. Richtig, genau aus diesem Gund.
Ist nicht mein Programm, das ist Werners Programm, ich hab das nur übertragen!
|
Profil
|
ebikerni
Aktiv  Dabei seit: 17.10.2020 Mitteilungen: 272
 | Beitrag No.43, vom Themenstarter, eingetragen 2023-02-05
|
Hallo Knaaxx,
Nochmals herzlichen Dank für Deine wertvollen Hinweise.
Ich konnte das Programm berichtigen. Auch für mich in interessanter Weise
habe ich die Werte wa, wb und a, b getauscht und die gleichen Ergebnisse erhalten und habe wieder dazu gelernt.
Gruß ebikerni
|
Profil
|
werner
Senior  Dabei seit: 23.10.2004 Mitteilungen: 2296
Wohnort: österreich
 | Beitrag No.44, eingetragen 2023-02-05
|
Profil
|
Knaaxx
Senior  Dabei seit: 06.05.2006 Mitteilungen: 2730
 | Beitrag No.45, eingetragen 2023-02-05
|
Hallo ebikerni
Du bist noch nicht entlassen.
Das funktioniert soweit gut, ist als "Notlösung" aber nicht perfekt.
Rechne mal folgendes,
a =20000000000000
wa=8000000000000
wb=14000000000000
oder auch
a =20e-20
wa=8e-20
wb=14e-20
Die Dreiecke sind ähnlich zu a=20, wa=8, wb=14, deswegen solltest gleiches Ergebnis erhalten, nur eben Stellenverschoben.
Du wirst aber ein Problem haben. (Arndt Brünner, rechnet das auch nicht)
|
Profil
|
ebikerni
Aktiv  Dabei seit: 17.10.2020 Mitteilungen: 272
 | Beitrag No.46, vom Themenstarter, eingetragen 2023-02-09
|
Hallo Knaaxx,
wenn ich mit h=1e-5 berechne, dann erhalte ich in der Kontrollberechnung
für die eingegebenen wa=8 und wb=14 für mich keine 15-stellige Genauigkeit :
wha = 8.000023232649442
whaa = 8.000023232649442
whb = 13.999993183314805
whbb = 13.999993183314801
whc = 15.440098738436527
whcc = 15.440098738436527
verändere ich h=1e-5 --> h=1e-14, dann kommt für mich ein gutes Ergebnis:
wha = 8.000000000000025
whaa = 8.000000000000027
whb = 13.999999999999993
whbb = 13.999999999999993
whc = 15.440079875060983
whcc = 15.440079875060986
Gruß ebikerni
|
Profil
|
Knaaxx
Senior  Dabei seit: 06.05.2006 Mitteilungen: 2730
 | Beitrag No.47, eingetragen 2023-02-10
|
Hallo ebikerni
Werners Programm ermittelt das c selbst bei einem Wert von h=100 (Einhundert!!) noch 1:1 korrekt. Die Iterationen steigen aber auf mehr als das Zehnfache an. Wenn das c korrekt ist, dann ist auch der Rest eindeutig bestimmt und korrekt.
Also daran kanns nicht liegen.
Du bist in eine Falle getappt.
Du hast dir das fehlende b ausgeben lassen etwa durch "print('b= ',b) und das ergibt Müll weil in der Tat abhängig von h.
für h=100 siehts so aus
\sourceon nameDerSprache
print('c = ', c,n,c0,'b = ',b)
c = 11.982942742269481 82 11.982942742269481 b = 126.0756082865753
\sourceoff
für h=1
\sourceon nameDerSprache
print('c = ', c,n,c0,'b = ',b)
c = 11.982942742269481 11 11.982942742269481 b = 16.331167872573456
\sourceoff
für h=1e-14
\sourceon nameDerSprache
print('c = ', c,n,c0,'b = ',b)
c = 11.982942742269481 14 11.982942742269481 b = 13.650792046209693
\sourceoff
und auch dieses letze b ist h modifiziert und weicht noch gering ab.
Mit "print(b)" hast du dir das falsche b ausgeben lassen. Das richtige b ist in all diesen 3 h-Varianten b = 13.65079204620966.
Vielleicht solltest du MontyPythagoras Programm auch mal versuchen. Aber bitte nicht abschreiben, da basteln sich unweigerlich Fehler rein.
Copy und bei dir Einfügen, Laufen lassen, Ergebnisse ansehen.
Erst wenn das Kopierte korrekt läuft kannst anfangen nach deinen Wünschen umzubasteln. Zwischendrin immer mal prüfen obs noch klappt.
https://www.matheplanet.de/matheplanet/nuke/html/viewtopic.php?rd2&topic=261206&start=0#p1898630
|
Profil
|
ebikerni
Aktiv  Dabei seit: 17.10.2020 Mitteilungen: 272
 | Beitrag No.48, vom Themenstarter, eingetragen 2023-02-11
|
Hallo Knaaxx,
ich habe die Werte von MontyPythagoras Programm auch angewendet, verglichen
und die gleichen Werte mit h = 1e-14 !! erhalten.
b = ... 20966 c = ... 269481.
Mit h=1e-05 ist nur das b schon ab der 5.Stelle falsch.
Für mich sind alle möglichen Kontrollberechnungen von großer Bedeutung und
haben im jetzigen Beispiel keine Widersprüche.
Gruß ebikerni
|
Profil
|
Knaaxx
Senior  Dabei seit: 06.05.2006 Mitteilungen: 2730
 | Beitrag No.49, eingetragen 2023-02-11
|
ebikerni
Mit h=1e-05 ist nur das b schon ab der 5.Stelle falsch.
Das ist falsch. Siehst du es nicht??
In der while-Schleife ist das "b" 2 mal aufgeführt.
Das obere "b" ist das Richtige,
das untere "b" ist das falsche b.
Das untere, das falsche b überschreibt das Richtige. Wenn die while-Schleife in den Abbruch geht, hat das falsche b das Richtige überschrieben.
Deswegen liefert print('b = ', b) einen falschen Wert. Das ist NICHT b.
Das ist b(h).
Nicht überall wo b draufsteht ist auch b drin!
Ohne Änderung am Programm kannst du das korrekte b NICHT abfragen, weil es durch den Programmablauf zerstört wird.
Lösung:
vorher
\sourceon nameDerSprache
while abs(c-c0)>hh and n<100:
c = c0 # 1
b = (a+c)*(1-(wb**2/(a*c)))**0.5 # 2 richtiges b
g1= b*c*(1-(a/(b+c))**2)-wa**2 # 3
b = (a+c+h)*(1-(wb**2/(a*(c+h))))**0.5 # 4 falsches b <--
g2= b*(c+h)*(1-(a/(b+c+h))**2)-wa**2 # 5
c0= c-h*g1/(g2-g1) # 6
n = n+1 # 7
\sourceoff
nacher, geändert!!
(Zeilen vertauscht 2,3 -> 4,5 und 4,5 -> 2,3)
\sourceon nameDerSprache
while abs(c-c0)>hh and n<100:
c = c0 # 1
b = (a+c+h)*(1-(wb**2/(a*(c+h))))**0.5 # 4 falsches b <--
g2= b*(c+h)*(1-(a/(b+c+h))**2)-wa**2 # 5
b = (a+c)*(1-(wb**2/(a*c)))**0.5 # 2 richtiges b
g1= b*c*(1-(a/(b+c))**2)-wa**2 # 3
c0= c-h*g1/(g2-g1) # 6
n = n+1 # 7
\sourceoff
und schon liefert print('b = ', b) den korrekten Wert für b !!!
Alternativ geht auch folgende Möglichkeit
\sourceon nameDerSprache
while abs(c-c0)>hh and n<100:
c = c0
B = b = (a+c)*(1-(wb**2/(a*c)))**0.5 # geändert, B = vorangestellt
g1= b*c*(1-(a/(b+c))**2)-wa**2
b = (a+c+h)*(1-(wb**2/(a*(c+h))))**0.5
g2= b*(c+h)*(1-(a/(b+c+h))**2)-wa**2
c0= c-h*g1/(g2-g1)
n = n+1
\sourceoff
print('b = ', B) # Großbuchstabe B !!
Auch das liefert dann den korrekten b-Wert.
(während print('b = ', b) nachwievor den Müll abliefert)
3. Möglichkeit
\sourceon nameDerSprache
print('b = ', (a+c)*(1-(wb**2/(a*c)))**0.5)
\sourceoff
liefert ebenfalls den korrekten Wert für b.
Alle diese Varianten liefern für h=100, h=1, h=1e-5 oder h=1e-14 den korrekten Wert für b.
|
Profil
|
Knaaxx
Senior  Dabei seit: 06.05.2006 Mitteilungen: 2730
 | Beitrag No.50, eingetragen 2023-02-12
|
Hallo ebikerni
Achtung, die vorherige Post wurde nach etwas übersichtlicher abgeändert.
Mein Vorschlag wäre, nimm Möglichkeit 2 (die mit Goß B). Ist am einfachsten umzusetzen. Geringste Fehleranfälligkeit.
|
Profil
|
ebikerni
Aktiv  Dabei seit: 17.10.2020 Mitteilungen: 272
 | Beitrag No.51, vom Themenstarter, eingetragen 2023-02-13
|
Hallo Knaaxx,
ich habe die 2.Möglichkeit mit Erfolg angewendet,
die Zeile b=(a+c)... B=vorangestellt und die richtigen Werte b und c erhalten.
Vielen Dank für Deine wertvollen Hinweise.
Gruß ebikerni
|
Profil
|
ebikerni hat die Antworten auf ihre/seine Frage gesehen. | Seite 2 | Gehe zur Seite: 1 | 2 |
|
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2023 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen. Lesen Sie die
Nutzungsbedingungen,
die Distanzierung,
die Datenschutzerklärung und das Impressum.
[Seitenanfang]
|