簡體   English   中英

Java編程中使用歐拉求解常微分方程

[英]Solving Ordinary Differential Equations using Euler in Java Programming

我正在嘗試編寫一個 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代碼來收集用戶的任何常微分方程以便使用歐拉方法求解,我會很高興。

您正在尋找的是在運行時編譯一些代碼的能力,其中部分代碼由用戶提供。

有一個名為 JOOR 的包,它為您提供了一個包含 compile 方法的 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% 絕對無條件地保證用戶只能輸入要解決的功能。 如果他們提供代碼,請記住,除非您采取保護措施,否則他們輸入的代碼很容易成為刪除硬盤驅動器上所有文件(或更糟)的代碼。

對於您問題的第二部分 - 我如何使用 Euler 方法在 Java 中實現解決方案,也許可以查看此鏈接: Java 中的 Euler 方法或此https://rosettacode.org/wiki/Euler_method#Java幾乎所有你能想象到的語言(可能還有一些你不能想象)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM