2017-11-01 3 views
0

Ich habe Probleme, die aktualisierten Werte von initial_guess_1 und initial_guess_2 zurück in die GoldenSectionSearch-Methode (Ich habe versucht, die Methode selbst aufrufen, bis die Beendigungsbedingung mit dem "if" zugeordnet ist). Meine Versuche, diese Lösung selbst wurden beeinflusst durch das, was ich hier gefunden:Wie übergebe ich aktualisierte Parameterwerte zurück an die Methode, von der sie kamen?

https://softwareengineering.stackexchange.com/questions/286008/parameters-are-passed-by-value-but-editing-them-will-edit-the-actual-object-li

http://www.java-tutorial.com/java-tutorial/java-classes-methods/java-call-reference/

Ich bin immer noch nicht in der Lage, herauszufinden, was ich tue, falsch aktualisierte Werte bei dem Versuch, in die sie zurück zu gelangen Methode. Was mache ich falsch und wie repariere ich es? Ich bin ein Neuling bei der Programmierung und möchte Dinge in die kleinsten, am leichtesten verstandenen Begriffe zerlegen.

public static double GoldenSectionSearch(double x_1, double x_2, double initial_guess_1,double initial_guess_2 ,double gradient_x, double gradient_y, double a,double a_0,double a_1,double a_2,double b_0,double b_1,double p,double N){ 

      //Stuff 

     if(Math.abs((100*(x_2 - x_1*x_1)*(x_2 - x_1*x_1) + (1- x_1)*(1- x_1)) - (100*(initial_guess_2 - initial_guess_1*initial_guess_1)*(initial_guess_2 - initial_guess_1*initial_guess_1) + (1- initial_guess_1)*(1- initial_guess_1)))/Math.abs(1+(100*(initial_guess_2 - initial_guess_1*initial_guess_1)*(initial_guess_2 - initial_guess_1*initial_guess_1) + (1- initial_guess_1)*(1- initial_guess_1))) >=0.50*Math.pow(10,-6)){ 

        initial_guess_1=x_1; 
        initial_guess_2=x_2; 
        //Double Boxed_a = new Double(a); 
        Double Boxed_initial_guess_1 = new Double(initial_guess_1); 
        Double Boxed_initial_guess_2 = new Double(initial_guess_2); 


        initial_guess_1.GoldenSectionSearch(initial_guess_1); 
        initial_guess_2.GoldenSectionSearch(initial_guess_2); 
        gradient_x = (400*initial_guess_1*(initial_guess_1*initial_guess_1 - initial_guess_2) + 2*(initial_guess_1 -1)); 
        gradient_y = (200*(initial_guess_2 - initial_guess_1*initial_guess_1)); 

        GoldenSectionSearch(initial_guess_1,initial_guess_2,x_1, x_2, gradient_x, gradient_y, a, a_0, a_1, a_2, b_0, b_1, p,N);  


     } else{ 



       double f_x=(100*(x_2 - x_1*x_1)*(x_2 - x_1*x_1) + (1- x_1)*(1- x_1)); 
       System.out.print("alpha = " + a + " " + "x_1 = " + x_1 + " " + "x_2 = " + x_2 + " " + "f_x = " + f_x); 
     } 



     // Double Boxed_a = new Double(a); 


     return x_2; 

     } 

Antwort

0

Sie können Primitive nicht ändern. Sie müssen Wrapper-Klasse mit Getter/Setter

public class MyWrapperObject { 

    private double x_1; 
    private double x_2; 
    private double initial_guess_1; 
    private double initial_guess_2; 
    private double gradient_x; 
    private double gradient_y; 
    private double a; 
    private double a_0; 
    private double a_1; 
    private double a_2; 
    private double b_0; 
    private double b_1; 
    private double p; 
    private double N; 

    public double getX_1() { 
     return x_1; 
    } 

    public void setX_1(double x_1) { 
     this.x_1 = x_1; 
    } 
    /* The rest of getters/setters */ 
} 

als übergeben es an Ihre Methode erstellen und verwenden Sie es wie

public static double GoldenSectionSearch(MyWrapperObject obj){ 
     // ... 
     double initial_guess_1 = obj.get_initial_guess_1(); 
     double initial_guess_2 = obj.get_initial_guess_2(); 
     obj.setGradient_x(400*initial_guess_1*(initial_guess_1*initial_guess_1 - initial_guess_2) + 2*(initial_guess_1 -1)); 
     // ... 
    } 

Es gibt auch eine Frage hier auf SO, ob Java ist pass-by-reference oder pass-by-value https://stackoverflow.com/a/40523/2022162

Verwandte Themen