Решение обыкновенных дифференциальных уравнений с помощью Эйлера в Java-программировании - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь написать программу Java, которая будет решать любые обыкновенные дифференциальные уравнения с использованием метода Эйлера, но я не знаю, как написать код, чтобы получить любое дифференциальное уравнение от пользователя.Мне удалось только написать код для решения заранее определенных обыкновенных дифференциальных уравнений.

Я смог прийти с кодом для решения некоторых конкретных обыкновенных дифференциальных уравнений, которые были записаны как функции в программе, я также провел исследование в Интернете, чтобы найти похожие проблемы, но, похоже, они также написали его, чтобы решить некоторыеобозначенная задача, а не общие вопросы по обыкновенным дифференциальным уравнениям.Это было найдено в большинстве статей, прочитанных онлайн.

Вот мой класс Эйлера;

import java.lang.Math;

public class Euler {
    private double x0, y0, x1, y1, h, actual;

    public Euler (double initialx, double initialy,double stepsize,double finalx1) {  
        x0 = initialx; y0 = initialy; h=stepsize; x1 = finalx1;
    }

    public void setEuler (double initialx, double initialy,double stepsize, 
    double finalx1){
        x0 = initialx;y0 = initialy;h   =stepsize;x1 = finalx1;
    }

    public double getinitialx(){
        return x0;
    }

    public double getinitialy(){
        return y0;
    }

    public double getinitialexact(){
        return (double) (0.9048*Math.exp(0.1*x0*x0));
    }

    double func(double x, double y){
        return (double) (0.2*x*y);
    }

    double funct(double x){
        return (double) (java.lang.Math.exp(0.1*x*x));
    }

    public double getinitialerror(){
        return (double) Math.abs(actual - y0);
    }

    public double getEulerResult(){
        for (double i = x0 + h; i < x1; i += h){
            y0 = y0 + h *(func(x0,y0));
            x0 += h;
            double actual = (0.9048*funct(x0));
            double error = Math.abs(actual - y0);
            System.out.printf("%f\t%f\t%f\t%f\n",x0,y0,actual, error);
        }
        return y0;
    }

}

Вот мой класс водителя

import java.util.Scanner;

public class EulerTest {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        Euler myEuler = new Euler(1.0,1.0,0.1,1.5);
        System.out.println( "x\t    explicit\tactual\t  error\t    " );

        System.out.printf("%f\t%f\t%f\t%f\n", myEuler.getinitialx(), 
        myEuler.getinitialy(),myEuler.getinitialexact(),
        myEuler.getinitialerror());

        System.out.printf("my approximated value is %f\n\n", 
        myEuler.getEulerResult ());

        System.out.println("enter another initial value of x: ");
        double initialx = input.nextDouble();

        System.out.println("enter another initial value of y: ");
        double initialy = input.nextDouble();

        System.out.println("enter another stepsize value of h: ");
        double stepsize = input.nextDouble();

        System.out.println("enter another upper  bound of x: ");
        double finalx1 = input.nextDouble();

        myEuler.setEuler(initialx,initialy,stepsize,finalx1);
        System.out.println( "x\t    explicit\tactual\t  error\t    " );

        System.out.printf("%f\t%f\t%f\t%f\n", myEuler.getinitialx(), 

        myEuler.getinitialy(),myEuler.getinitialexact(),
        myEuler.getinitialerror());

        System.out.printf("my approximated value is %f\n\n", 
        myEuler.getEulerResult ());

    }
}

Я будурад, если я могу понять, как написать код Java для сбора любого обыкновенного дифференциального уравнения от пользователя, чтобы решить, используя метод Эйлера.

1 Ответ

0 голосов
/ 03 мая 2019

Что вам нужно, так это возможность компилировать некоторый код во время выполнения, когда часть кода предоставляется пользователем.

Существует пакет JOOR, который предоставляет вам класс Reflect, который содержитметод компиляции.Метод принимает два параметра (имя пакета: String и код Java: String).Я никогда не использовал его лично, поэтому не могу ручаться за его надежность, но вот учебник и Javadoc:

https://www.jooq.org/products/jOOR/javadoc/latest/org.jooq.joor/org/joor/Reflect.html#compile(java.lang.String,java.lang.String)

https://blog.jooq.org/2018/04/03/how-to-compile-a-class-at-runtime-with-java-8-and-9/

ВВ вашем случае вы должны поставить пользовательскую функцию вместо следующей строки кода:

return \"Hello World!\";\n"

Осторожно, вы должны быть на 100% абсолютно безоговорочно гарантированы, что пользователь может только когда-либо ввести функцию, которая будетрешена.Если они предоставляют код, помните, что если вы не примете меры предосторожности, код, который они вводят, может очень легко быть кодом, удаляющим все файлы на вашем жестком диске (или хуже).

Для второй части вашего вопроса- Как мне реализовать решение в Java с использованием метода Эйлера, возможно, посмотрите следующую ссылку: Метод Эйлера в java или этот https://rosettacode.org/wiki/Euler_method#Java, в котором оно есть практически на всех языках, которые вы можете себе представить (ивероятно, вы не можете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...