Schmetterlingseffekt (Schleifen)
Unter dem Begriff Schmetterlingseffekt bezeichnet man eine kleine Ursache, die eine große Wirkung zeigt.
Die folgende Iteration soll 10'000 mal ausgeführt werden:
wert ← 4 * wert * (1 - wert)
Starten Sie mit den Werten 0.12345; 0.123456789012345 und 0.123456789012344
Begründen Sie das Resultat.
0 Kommentare
9 Lösung(en)
package ch.programmieraufgaben.iteration.butterfly;
import java.util.Scanner;
/**
* Schmetterlingseffekt an 10'000facher Iteration
* @author Philipp Gressly (phi AT gressly DOT ch)
*/
public class ButterFly {
public static void main(String[] args) {
new ButterFly().top();
}
void top() {
double start = eingabeDouble("Startzahl" );
int iterationen = 10_000; //eingabeInt ("Iterationen");
double end = iteriere(start, iterationen);
System.out.println("Endpunkt: " + end);
}
double iteriere(double start, int iterationen) {
double wert = start;
while(iterationen > 0) {
wert = 4 * wert * (1 - wert);
iterationen = iterationen - 1;
}
return wert;
}
Scanner sc = new Scanner(System.in);
String eingabe(String wertAnfrage) {
System.out.println("Bitte " + wertAnfrage + " eingeben: ");
return sc.nextLine();
}
double eingabeDouble(String wert) {
return Double.parseDouble(eingabe(wert));
}
int eingabeInt(String wert) {
return Integer.parseInt(eingabe(wert));
}
} // end of class ButterFly
Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)
wert = float (input("Geben Sie den Wert ein: "))
def calculate(wert):
for i in range(10000):
wert = 4*wert*(1-wert)
print(wert)
calculate(wert)
Lösung von: Py Thon ()
#include <iostream>
using namespace std;
int main()
{
int iterations = 10000;
int chooser = 0;
long double value = 0.0;
do
{
cout << "Wähle einen Startwert" << endl;
cout << " 1 = 0.12345" << endl;
cout << " 2 = 0.123456789012345" << endl;
cout << " 3 = 0.123456789012344" << endl;
cin >> chooser;
}while(chooser != 1 && chooser != 2 && chooser != 3);
switch(chooser)
{
case(1):
value = 0.12345;
break;
case(2):
value = 0.123456789012345;
break;
case(3):
value = 0.123456789012344;
break;
default:
break;
}
cout << value << endl;
for(int i = 0; i < iterations; i++)
{
value = 4 * value * (1-value);
cout << value << endl;
}
cin.ignore();
cin.get();
}
Lösung von: R. Z. (FH-Dortmund)
#!/usr/bin/env perl
use strict;
use warnings;
print "Bitte geben Sie den Wert ein: ";
my $wert = <STDIN>;
chomp( $wert );
my $ergebnis;
sub calculate {
my $self = shift;
for ( my $i = 0; $i <= 10000; $i++ ) {
$ergebnis = 4 * $self * ( 1 - $self );
}
return $ergebnis;
}
print "Ergebnis: " . calculate($wert) . "\n";
Lösung von: Josef Florian Sedlmeier (Exirius IT-Dienstleistungen GmbH)
program Schmetterlingseffekt (input, output);
{ uebungsbeispiel fuer Schleifen }
const
DURCHLAEUFE = 10000;
type
tIndex = 1..DURCHLAEUFE;
var
i: tIndex; { laufvariable }
Zahl: double;
begin
writeln('Bitte eine Zahl eingeben: ');
readln(Zahl);
for i := 1 to DURCHLAEUFE do
Zahl := 4 * Zahl * (1-Zahl);
writeln('Das Ergebnis ist: ', Zahl);
end. { Schmetterlingseffekt }
Lösung von: Patrick Reif ()
var value = parseFloat(prompt("Startwert")),
i = 0;
for (i; i <= 10000; i++) {
value = 4 * value * (1 - value);
}
console.log(value);
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
<?php
$wert1 = 0.12345;
$wert2 = 0.123456789012345;
$wert3 = 0.123456789012344;
echo 'Startwert 1 = '. $wert1. '<br>';
for($i = 0; $i <= 10000; $i++){
$wert1 = 4 * $wert1 * (1 - $wert1);
}
echo 'Endwert 1 = '. $wert1. '<br>';
echo '<br>';
echo 'Startwert 2 = '. $wert2. '<br>';
for($i = 0; $i <= 10000; $i++){
$wert2 = 4 * $wert2 * (1 - $wert2);
}
echo 'Endwert 2 = '. $wert2. '<br>';
echo '<br>';
echo 'Startwert 3 = '. $wert3. '<br>';
for($i = 0; $i <= 10000; $i++){
$wert3 = 4 * $wert3 * (1 - $wert3);
}
echo 'Endwert 3 = '. $wert3. '<br>';
Lösung von: Julian Mueller (BSZ Würzburg)
// NET 6.x | C# 10.x | VS-2022
var lstStartwerte = new List<double> { 0.12345, 0.123456789012345, 0.123456789012344 };
double Iter(double v, int n) {
for (var i = 0; i < n; i++)
v = 4 * v * (1 - v);
return v;
}
lstStartwerte.ForEach(x => Console.WriteLine($"Eingabe: {x}\nAusgabe: {Iter(x, 10_000)}\n"));
Lösung von: Jens Kelm (@JKooP)
// C++ 17
#include <iostream>
#include <vector>
#include <iomanip>
int main() {
const std::vector<double>startwerte{ 0.12345, 0.123456789012345, 0.123456789012344 };
const auto iter{ [&startwerte](double v, int n) {for (auto i{ 0 }; i < n; ++i) v = 4 * v * (1 - v); return v;} };
for(const auto& sw : startwerte)
std::cout << std::fixed << "Eingabe: " << sw << "\nAusgabe: " << std::setprecision(15) << iter(sw, 10'000) << "\n\n";
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
Je nach Rechengenauigkeit kommen die verschiedensten Resultate (jedoch alle im im Zahlenbereich Null bis Eins) vor.
Die Reihenentwicklung der gegebenen Formel zeigt ein stark chaotisches Verhalten.
Hier meine Resultate (Java):
Eingabe: 0.12345
Ausgabe: 0.8459851292988083
Eingabe: 0.123456789012345
Ausgabe: 0.9932530780939162
Eingabe: 0.123456789012344
Ausgabe: 0.475016701262336
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 0.5 |
Schwierigkeit: | Mittel |
Webcode: | 0ws8-2b4f |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |