我正在尝试编写一个Java程序,该程序将使用Euler方法求解任何普通的微分方程,但是我不知道如何编写代码来从用户那里获得任何微分方程。我只能编写代码来解决预定义的常微分方程。
我能够提供一个代码来解决一些特定的常微分方程,这些常微分方程被编写为程序中的函数,我也进行了在线研究以寻找类似的问题,但似乎他们也编写了该函数来解决一些指定的问题,关于常微分方程的一般问题。在大多数已在线阅读的文章中都发现了这一点。
这是我的欧拉班;
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代码以收集用户的任何微分方程式以便使用欧拉方法进行求解,我将感到高兴。
答案 0 :(得分:-1)
您要寻找的是能够在运行时编译某些代码的功能,其中部分代码由用户提供。
有一个名为JOOR的软件包,它为您提供了一个包含编译方法的Reflect类。该方法采用两个参数(程序包名称:String和Java代码:String)。 我从来没有亲自使用过它,因此不能保证它的健壮性,但这是一个教程和javadoc:
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中实现解决方案,请查看以下链接:Euler's Method in java或此https://rosettacode.org/wiki/Euler_method#Java,其中包含几乎您所用的每种语言可以想象(也许你不能想象)。