Как решить синусоидальное математическое уравнение в Java? - PullRequest
0 голосов
/ 23 декабря 2018

Как решить следующее математическое уравнение в Java?

Уравнение: x + sin(x) = constant, где x - переменная.Я столкнулся с этим уравнением через 18 лет.Я забыл эту основную концепцию.Пожалуйста, помогите мне в этом основном вопросе средней школы.

Я пытался закодировать вышеприведенное уравнение x + sin(x) = constant, как показано ниже, однако он дает неправильный ответ.Пожалуйста, дайте мне знать, где я не прав.

    public double balanceLength(double total_weight) {
        // 5.00 assume inical value of x
        return newtonRaphson( 5.00,  total_weight);
    }
    private static double derivFunc(double x)
    {
        return sin(x) + x;
    }
    private static double func(double x, double weight)
    {
        return sin(x) + x - weight;
    }
    static double newtonRaphson(double x, double weight)
    {

        double h = func(x, weight) / derivFunc(x);
        while (abs(h) >= EPSILON)
        {
            h = func(x, weight) / derivFunc(x);
            x = x - h;
        }

        return round(x * 100.0) / 100.0 ;
    }

1 Ответ

0 голосов
/ 23 декабря 2018

Это очень базовая реализация, только частично протестированная.Он повторяет x в радианах, что удовлетворяет y=six(x) +x для данного y:

//returned value in radians
static double evaluateSinxPlusx(double y){

    double delta = y>0 ?  0.01 : -0.01 ;//change constants
    double epsilon = 0.01;            //to change
    int iterations = 100;             //accuracy

    double x = 0;
    double sum = 1;

    while(Math.abs(y - sum) > epsilon) {
        x+=delta;
        //based Taylor series approximation
        double term = 1.0;
        sum  = x;
        double d = 1;
        for (int i = 1; i< iterations; i++) {
             term = Math.pow(x, i);
             d*=i;
             if (i % 4 == 1) {

                sum += term/d;
            }
             if (i % 4 == 3) {
                sum -= term/d;
            }
         }
    }
    return x;
}

//test it 
public static void main(String[] args) throws Exception{

    double y = 0.979;
    //expected x = 0.5 radians
    System.out.println("for x="+ evaluateSinxPlusx(y)+"(radians), sin(x)+x = "+ y);

    y = -0.979;
    //expected x = - 0.5 radians
    System.out.println("for x="+ evaluateSinxPlusx(y)+"(radians), sin(x)+x = "+ y);

    y = 0.33256;
    //expected x = 0.16666 radians
    System.out.println("for x="+ evaluateSinxPlusx(y)+"(radians), sin(x)+x = "+ y);
}

Это не надежная реализация, и ее следует использовать только в качестве демонстрационной версии.

...