Problem bei einer Aufgabe.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Neiqi
User
Beiträge: 26
Registriert: Freitag 18. Oktober 2019, 15:10

Sehr geehrte Community,
ich habe ein Problem bei dieser Aufgabe :

Herr Maier möchte in seinem Garten ein Salatbeet anlegen. Um den Salat gegen Schnecken zu schützen möchte er eine Schneckenschutzkante einsetzen. Da diese Kante allerdings nicht ganz billig ist, sucht Herr Maier nach dem rechteckigen Feld, welches Ihm die größte Fläche bei kleinstem Umfang des Beetes generiert. Er möchte möglichst genau 75,5 m² von seinem Garten für das Salatbeet abteilen. Schreiben Sie für Herrn Maier ein Optimierungsprogramm, welches Ihm diese Aufgabe löst. Dazu implementieren Sie bitte 2 Funktionen, die eine berechnet den Flächeninhalt und die andere den Umfang. Beide Funktionen sollen das Berechnungsergebnis als reelle Zahl zurückliefern und die aktuellen Kantenlängen als reelle Zahlen übergeben bekommen. Das Problem soll in diskreten Schritten von 0,01 m angenähert werden. Geben Sie als Ergebnis die beiden Kantenlängen, die Fläche und den Umfang im Notebook aus.

Mein Ansatz:

Code: Alles auswählen

A = float(input("Gebe hier deine Fläche ein"))
a = float
b = float

def Hauptbedingung(A, a, b):
    2*A/b+2*b = U

def Nebenbedingung(A, a, b):
    A = a*b
Jedoch weiß ich nicht wie ich eine variable Teile durch eine andere wenn ich für die eine überhaupt kein Wert habe.
Vielleicht hat jemand ein Rat.
PS: Nein es ist keine Hausaufgabe, es ist eine Aufgabe zur Klausurenvorbereitung.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Na ja, ein Ansatz wäre, das durch Ausprobieren von bestimmten Kombinationen zu lösen. Und da hast du dann auch Werte. Bisher hast du nur ein paar Funktionen (die übrigens auch nicht so benannt sind, wie das in Python üblich ist; Funktions- und Variablennamen schreibt man Klein mit Unterstrichen).

(Ich habe mir deine Aufgabe nicht im Detail angesehen und weiß nicht, ob das geht, aber wenn ich mich richtig entsinne, kann man Optimierungsprobleme dieser Art an sich doch eigentlich exakt und ohne Computer lösen, mit ein bisschen Analysis).
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Ok, es ist spät und möglicherweise bin ich dumm, aber:
Da diese Kante allerdings nicht ganz billig ist, sucht Herr Maier nach dem rechteckigen Feld, welches Ihm die größte Fläche bei kleinstem Umfang des Beetes generiert.
Ist der Umfang eines Rechteckes bei gegebener Fläche nicht immer gleich?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sparrow hat geschrieben: Samstag 18. Januar 2020, 22:18 Ist der Umfang eines Rechteckes bei gegebener Fläche nicht immer gleich?
Ein Rechteck mit 100m² kann 100m * 1m groß sein. Es könnte sich aber auch um ein Quadrat handeln. Im Ersten Fall hast du 202 Meter Umfang, im zweiten nur 40 Meter. Den minimalen Umfang erreicht man übrigens immer mit einem Quadrat, deshalb versteh ich auch den Sinn der Aufgabe nicht.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nö. Einfaches Gegenbeispiel: 1x4 und 2x2 Rechtecke haben einmal 10 und einmal 8 Umfang.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

@me: zum lernen wie numerisches optimieren geht ist es eine sinnvolle Aufgabe. Es wird ja nicht nur das Ergebnis bewertet.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Neiqi: Du könntest als erstes mal die beiden geforderten Funktionen schreiben und testen. Dein ”Ansatz” ist ja eher geraten und ganz offensichtlich falsch, weil syntaktisch kein Python:

Code: Alles auswählen

$ python3 forum16.py 
  File "forum16.py", line 6
    2*A/b+2*b = U
    ^
SyntaxError: can't assign to operator
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich bekomme da übrigens das hier als Ergebnis heraus. `a` und `b` kann man natürlich auch vertauschen.

Code: Alles auswählen

a=10.000000 b=7.550000 A=75.500000 U=35.100000
@/me: Das Quadrat hat dann aber keine Kantenlänge die durch 0.01 teilbar ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

__blackjack__ hat geschrieben: Mittwoch 29. Januar 2020, 12:58 @/me: Das Quadrat hat dann aber keine Kantenlänge die durch 0.01 teilbar ist.
Das stimmt natürlich. Die zweitbeste Lösung liegt übrigens bei 6.25 und 12.08.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die liesse sich mit dem Programm mit dem ich meine Lösung gefunden habe gar nicht so leicht bestimmen, weil man in GW-BASIC nicht so einfach dynamische Datenstrukturen modellieren kann und man sich auch das sortieren der gefundenen Ergebnisse selbst schreiben müsste:

Code: Alles auswählen

10 TA=75.5:SS=.01:DEF FN A(W,H)=W*H:DEF FN C(W,H)=2*(W+H):MS%=TA/SS
20 WS%=MS%:HS%=1:RC=1E+32:RW=0:RH=0
30 WHILE WS%>=HS%:W=WS%*SS:H=HS%*SS
40 A=FN A(W,H):IF A=TA THEN C=FN C(W,H):IF C<RC THEN RC=C:RW=W:RH=H
50 IF A>TA THEN WS%=WS%-1 ELSE HS%=HS%+1
60 WEND:PRINT USING "&_=###.####_ ";"a",RW,"b",RH,"A",FN A(RW,RH),"U",RC
Man kann es natürlich umschreiben so das es einfach alle Ergebnisse ausgibt, sortiert ist das ja dann schon (absteigend nach Umfang):

Code: Alles auswählen

10 TA=75.5:SS=.01:DEF FN A(W,H)=W*H:DEF FN C(W,H)=2*(W+H):MS%=TA/SS
20 WS%=MS%:HS%=1
30 WHILE WS%>=HS%:W=WS%*SS:H=HS%*SS
40 A=FN A(W,H):IF A=TA THEN GOSUB 70
50 IF A>TA THEN WS%=WS%-1 ELSE HS%=HS%+1
60 WEND:END
70 PRINT USING "&_=###.####_ ";"a",W,"b",H,"A",FN A(W,H),"U",FN C(W,H)
80 RETURN
Ausgabe:

Code: Alles auswählen

a= 75.5000 b=  1.0000 A= 75.5000 U=153.0000                                     
a= 60.4000 b=  1.2500 A= 75.5000 U=123.3000                                     
a= 50.0000 b=  1.5100 A= 75.5000 U=103.0200                                     
a= 37.7500 b=  2.0000 A= 75.5000 U= 79.5000                                     
a= 30.2000 b=  2.5000 A= 75.5000 U= 65.4000                                     
a= 25.0000 b=  3.0200 A= 75.5000 U= 56.0400                                     
a= 15.1000 b=  5.0000 A= 75.5000 U= 40.2000                                     
a= 12.5000 b=  6.0400 A= 75.5000 U= 37.0800                                     
a= 12.0800 b=  6.2500 A= 75.5000 U= 36.6600                                     
a= 10.0000 b=  7.5500 A= 75.5000 U= 35.1000     
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten