2017-06-10 6 views
1

Ich versuche, etwas Spaß zu haben, indem Sie etwas Java in C# umwandeln, ich habe den folgenden Code von Java.Delegierte helfen Java zu C#

public void calculate() { 
    UnivariateFunction forceBalance = (double x) -> { 
     return Mu - k1 * fcu * b * x * (d - k2 * x); 
    }; 
    BrentSolver biSolver = new BrentSolver(1e-6); 
    x = biSolver.solve(1000, forceBalance, 0, d/2, 1); 

    As = Mu/(gamma_r * fy * (d - k2 * x)); 
} 

Kein alles, was ich in C# finden kann, ist, dass diese MathNet.Numerics zu lösen scheint, als diese RootFinding.Brent.FindRoot enthält.

Ich fand andere Sachen, die das lösen könnten, aber ich habe nicht $ 900.

Hier ist, was ich habe, aber ich denke, dass ich etwas verpassen könnte, da mein Wissen bezüglich Delegierten nicht das Beste ist.

class Program 
{ 
    public static double Mu = 100e6; 
    public static double K1 = 0.45 * (1 - (Math.Sqrt(fcu)/52.5)); 
    public static double fcu = 30.00; 
    public static double b = 300.00; 
    //public static double c = 0.00; 
    public static double d = 500.00; 
    public static double k2 = (Math.Pow(2 - Math.Sqrt(fcu)/17.5, 2) + 2)/(4 * (3 - (Math.Sqrt(fcu)/17.5))); 

    static void Main(string[] args) 
    { 
     Calculate(); 
    } 

    public static void Calculate() 
    { 
     Func<double, double> abc = x => Mu - K1 * fcu * b * x * (d - k2 * x); 

     var a = MathNet.Numerics.RootFinding.Brent.FindRoot(abc, 0, 10000, 1e-6); 

     Console.WriteLine(); 
     Console.ReadLine(); 
    } 

} 

Ausführen dieses mir der folgende Fehler gibt: failed übertraf die Anzahl der Iterationen erlaubt oder es ist keine Wurzel innerhalb der vorgesehenen Grenzen ‚.

Nun gehe ich davon aus, dass dies daran liegt, dass die Funktion x nicht auflöst.

Fehle ich etwas?

Bitte beachten Sie auch, dass dies weit über meinem Qualifikationsniveau liegt, aber ich versuche mich zu verbessern.

+0

Warum versuchen Sie, quadratische Gleichung numerisch zu lösen? –

Antwort

1

Eingabewerte

Erstens, wenn Ihre Frage über Eingabewerte ist, Blick auf die Antwort von soton geschrieben. Möglicherweise verwenden Sie die falschen FindRoot-Eingabewerte. Brent Math.Net.

double FindRoot(Func<double, double> f, double lowerBound, double upperBound, double accuracy, int maxIterations) 

Delegierten

nun mit Ihrer Frage Ich glaube, Sie fragen sich, wie die Delegierten in C# behandelt werden vs Java. (Ich werde deinen Spaß nicht verderben).

Ein Delegat ist der Platzhalter für eine Methode, die mit einer bestimmten Signatur übereinstimmt (ein Verweis auf eine Methode).

Das folgende Beispiel zeigt eine Variable, die dem Delegattyp Func<int, bool> entspricht. Das bedeutet, dass sie eine Ganzzahl (x) als Parameter akzeptiert und einen Booleschen Wert zurückgibt. Die Art und Weise, wie dieses Beispiel deklariert wird (mit einem anonymen Methodenkörper), wird als Lambda-Ausdruck bezeichnet.

Hier ist wieder dasselbe, aber die Delegate-Variable wird von einer Methodendeklaration zugewiesen.

Func<int, bool> greaterThanZero = SomeGreaterThanZeroMethod; 

Wie rufen wir einen Delegierten? Wir rufen es auf! z.B.

In vielen Situationen möchten Sie sicherstellen, dass der Methodenhauptteil nicht null ist, z.

bool isGreater = false; 
if (greaterThanZero != null) 
    isGreater = greaterThanZero.Invoke(-1); 

Oder den schicken neuen Null-Conditional-Operator (?)

bool isGreater = greaterThanZero?.Invoke(-1); 

Es gibt hier mehr als Sie möglicherweise in einer Antwort zusammenzufassen könnten.Einige Ressourcen: https://www.tutorialspoint.com/csharp/csharp_delegates.htm https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions

+1

Die Erhöhung der Anzahl der maxIterations hilft nicht, wenn keine Wurzel im Intervall ist. –

+0

Sie haben Recht. Ich versuche herauszufinden, ob er korrekte Eingabewerte wissen oder Delegierte verwenden möchte. Ich werde den Abschnitt über Iterationen in meiner Antwort aktualisieren. – TomTom

+1

Hallo, Vielen Dank für die Antwort, ich habe aufgegeben Brent zu verwenden. Stellt sich heraus, ein Mathematikgenie zu haben, wie sich ein Freund auszahlt. Er half, indem er nur die Mathematik ohne irgendwelche Hilfsfunktionen machte, dann haben wir das einfach in Code umgewandelt, auch unsere Delegaten sind nicht magisch und ich hatte keine Ahnung, wofür sie eigentlich verwendet werden sollten. Deine Erklärung hat dir sehr geholfen. –

0

Ihre isssue wird weder durch MathNet Numerik Umsetzung Brent Methode noch durch unsachgemäße Nutzung Delegierten. Sie erhalten diesen Fehler, da beide Wurzeln tatsächlich auf dem Intervall liegen, und die Auswertung der gegebenen Funktion für beide Intervallenden ergibt positive Zahlen, d. H. 100000000 und 162453965327, während die Brent-Methode erfordert, dass sie sich im Vorzeichen unterscheiden. Die tatsächlichen Wurzeln für diese speziellen Gleichungen liegen in 51,8 und 1057,15, daher sollte Ihr Eingabeintervall einen Punkt zwischen diesen beiden enthalten.

Um ehrlich zu sein, bin ich ein wenig überrascht, warum Java-Implementierung für diesen Parametersatz funktioniert. Sind Sie sicher, dass Sie während der Konvertierung nichts falsch geschrieben haben?

+0

Ich schätze die Hilfe, aber um ehrlich zu sein, ist es immer noch weit über meinem Können. Ich bleibe bei dem, wozu ich gut bin (Webanwendungen entwickeln) und überlasse die Mathematik den Mathe-Göttern. –