C# Heron Verfahren

Hallo,

ich habe versucht ein Programm zum Heron-Verfahren zu schreiben, bekomme aber leider kein Ergebnis bzw. 0 raus. Und ich finde auch den Fehler nicht. Wäre super, wenn mir jemand etwas weiterhelfen könnte, wo genau mein Fehler liegt und/oder wie ich es besser schreiben könnte.

Die Wurzel soll für die Zahlen zwischen 10 und 100 berechnet werden (in 10er-Schritten, also 10, 20, 30 usw.) und es darf nicht Math.sqrt verwendet werden.
Dir for-Schleife für die Ausgabe habe ich in die Main-Methode eingebaut, die Berechnung für Heron ist eine eigene Funktion.

C:
 double d = 0;                 // d ist der Wert für q
            double firstResult;           // Wert für das Ergebnis der ersten Iteration
            double secondResult;          // Ergebniswert für alle folgenden Iterationen

            firstResult = 1 / 2 + (1 + d / 1);
            secondResult = 1 / 2 * (firstResult + (d / firstResult));
            return secondResult;

Dankeschön im Voraus.
 

Dompteur

Top Contributor
Das Ergebnis der Division von 2 ganzzahligen Werten ist wiederum ein ganzzahliger Wert. Du erwartest aber wahrscheinlich ein Ergebnis von Typ double.
Also 1 / 2 ergibt 0 !
Du kannst einfach bei jeder ganzen Zahl ein ".0" anhängen.
 
Das Ergebnis der Division von 2 ganzzahligen Werten ist wiederum ein ganzzahliger Wert. Du erwartest aber wahrscheinlich ein Ergebnis von Typ double.
Also 1 / 2 ergibt 0 !
Du kannst einfach bei jeder ganzen Zahl ein ".0" anhängen.

Stimmt natürlich, danke.
Allerdings bekomme ich trotzdem nicht das richtige Ergebnis raus. Mein Programm gibt mir dasselbe Ergebnis für alle Zahlen aus und zwar 1,45 - das stimmt vor und hinten nicht.
 

Dompteur

Top Contributor
Ich habe das jetzt mit 2 weiteren Iterationen selbst ausprobiert.

Java:
using System;

public class Test
{
    public static void Main()
    {
        double d = 0;                 // d ist der Wert für q
        double firstResult;           // Wert für das Ergebnis der ersten Iteration
        double secondResult;          // Ergebniswert für alle folgenden Iterationen

        firstResult = 1.0 / 2.0 + (1.0 + d / 1.0);
        Console.WriteLine(firstResult);
        secondResult = 1.0 / 2.0 * (firstResult + (d / firstResult));
        Console.WriteLine(secondResult);
        double thirdResult = 1.0 / 2.0 * (secondResult + (d / secondResult));
        Console.WriteLine(thirdResult);
        double forthResult = 1.0 / 2.0 * (thirdResult + (d / thirdResult));
        Console.WriteLine(forthResult);
    }
}

Das liefert mir folgende Ausgabe:
Code:
1.5
0.75
0.375
0.1875

Du kannst das online hier nachvollziehen: https://ideone.com/g8lyfm
 
Ich habe das jetzt mit 2 weiteren Iterationen selbst ausprobiert.

Java:
using System;

public class Test
{
    public static void Main()
    {
        double d = 0;                 // d ist der Wert für q
        double firstResult;           // Wert für das Ergebnis der ersten Iteration
        double secondResult;          // Ergebniswert für alle folgenden Iterationen

        firstResult = 1.0 / 2.0 + (1.0 + d / 1.0);
        Console.WriteLine(firstResult);
        secondResult = 1.0 / 2.0 * (firstResult + (d / firstResult));
        Console.WriteLine(secondResult);
        double thirdResult = 1.0 / 2.0 * (secondResult + (d / secondResult));
        Console.WriteLine(thirdResult);
        double forthResult = 1.0 / 2.0 * (thirdResult + (d / thirdResult));
        Console.WriteLine(forthResult);
    }
}

Das liefert mir folgende Ausgabe:
Code:
1.5
0.75
0.375
0.1875

Du kannst das online hier nachvollziehen: https://ideone.com/g8lyfm

Also ich zeige jetzt mal die for-Schleife und die Ausgabe.
Irgendwo habe ich einen herben Fehler. Zudem ist mir bereits der erste Fehler aufgefallen: bei firstResult sollte es
"0.5 * (1.0 + (d/1.0))" lauten.
C:
Console.WriteLine("Wurzelberechnung mit dem Heronverfahren:");
            for (double d = 0; d <= 100; d += 10)
            {
                Console.WriteLine($"{d,4}  | {WurzelHeron(d),8:F5} | {Math.Sqrt(d),8:F5} |  {Math.Sqrt(d),8:F5}");
            }

2.PNG
 

Dompteur

Top Contributor
Das war schon der ganze Code...
Du hast im Eingangsbeitrag deine Heron-Implementierung gezeigt.
Da haben wir festgestellt, dass es auf jeden Fall Probleme mit den Integer-Zahlen gibt. Ich nehme an, dass du da etwas an deinem Code verändert hast.
Vielleicht ist bei dieser Veränderung etwas schief gegangen.
Außerdem ist dein erstes Code-Stück nur ein Ausschnitt einer Methode. Ich vermute, dass die vollständige Methode nicht viel länger ist. Also poste einfach die Methode in der aktuellen Fassung noch einmal.

Hast du meinen Code ausprobiert ? Wenn ich den ausführe, dann sehe ich, dass sich der Wert mit jeder Iteration dem erwarteten Ergebnis nähert.
 

JavaUndC-Prog

Bekanntes Mitglied
Hi in Java sieht das c.a so aus:

Java:
public class Heron {
    static double heron_methode(double x){
        // Eingabe
        double a = x;
        // Näherungswert
        double b = 1;
  
        for(int i = 0; i <=100; i++){
            b = (a+b)/2;
            a = x/b;
        }
        return a;
    }
    public static void main(String[] args){
        System.out.println(heron_methode(49));
    }
}

Die Idee ist ja, dass man einen Näherungswert hat (b) und eine Eingabe z.b. 49
Eingabe x, Näherungswert b. Das nähert man jetzt Schrittweise an.
Das lässt sich leicht in C# übersetzen :)

Ich habe das für mein Numerik Seminar von ein paar Tagen auch selbst noch gebraucht (halt nur in Java)

Der wesentliche Trick besteht eigentlich im Näherungswert, den kann man grob schätzen, oder so allgemein halten, wie ich das gemacht habe. Bei der Wurzel aus 49,5 liegt es aber nahe eine Näherung von 7 anzupeilen (da sqrt(49)=7, also sqrt(49,5)>7...
 
Zuletzt bearbeitet:

Feeder

Bekanntes Mitglied
Hi in Java sieht das c.a so aus:

Java:
public class Heron {
    static double heron_methode(double x){
        // Eingabe
        double a = x;
        // Näherungswert
        double b = 1;
 
        for(int i = 0; i <=100; i++){
            b = (a+b)/2;
            a = x/b;
        }
        return a;
    }


    public static void main(String[] args){
        System.out.println(heron_methode(49));
    }
}

Die Idee ist ja, dass man einen Näherungswert hat (b) und eine Eingabe z.b. 49
Eingabe x, Näherungswert b. Das nähert man jetzt Schrittweise an.
Das lässt sich leicht in C# übersetzen :)

Ich habe das für mein Numerik Seminar von ein paar Tagen auch selbst noch gebraucht (halt nur in Java)

Der wesentliche Trick besteht eigentlich im Näherungswert, den kann man grob schätzen, oder so allgemein halten, wie ich das gemacht habe. Bei der Wurzel aus 49,5 liegt es aber nahe eine Näherung von 7 anzupeilen (da sqrt(49)=7, also sqrt(49,5)>7...

Es existieren tatsächlich Leute die auf deutsch Code verfassen... Coole Sache :)
 

Neue Themen


Oben