gpt4 book ai didi

java - java中的欧拉方法

转载 作者:行者123 更新时间:2023-12-02 04:14:26 26 4
gpt4 key购买 nike

我编写了欧拉方法代码来查找 x(10) 的近似值,并将其与 separable ODE 中给出的精确解给出的 x(10) 值进行比较。但是,我的代码显示 x(10) 的困惑数字。您能指出一个重大错误吗?

谢谢。

 //@(#)euler.java
//This method attempts to find solutions to dx/dt = (e^t)(sin(x)) via
//Euler's iterative method and find an approximate value for x(10)


import java.text.DecimalFormat;

public class euler
{
public static void main(String[] Leonhard)
{

DecimalFormat df = new DecimalFormat("#.0000");


double h = (1.0/3.0); // h is the step-size
double t_0 = 0; // initial condition
double x_0 = .3; // initial condition
double x_f = 10; // I want to find x(10) using this method and compare it to an exact value of x(10)
double[] t_k;
t_k = new double[ (int)( ( x_f - x_0 ) / h ) + 1 ] ; // this two arrays hold the values of x_k and t_k
double[] x_k;
x_k = new double[ (int)( ( x_f - x_0 ) / h ) + 1 ] ;

int i; // the counter

System.out.println( "k\t t_k\t x_k" ); // table header

for ( i = 0; k < (int)( ( x_f - x_0 ) / h ) + 1; i++ )
{
if ( i == 0 ) // this if statement handles the initial conditions
{
t_k[i] = t_0;
x_k[i] = x_0;
}
else if ( i > 0 )
{
t_k[i] += i*h;
x_k[i] = x_k[i-1] + h*( Math.exp(t_k[i-1]))*(Math.sin(x_k[i-1]) );

}

System.out.println( k + " " + df.format(t_k[i]) + " " + df.format( x_k[i]) );
}
}
}

最佳答案

你的代码似乎可以工作。问题在于,欧拉方法是一种相当简单的对微分方程进行近似积分的方法。正如您所注意到的,它的准确性很大程度上取决于您使用的步长。

我运行了你的代码并与相同算法的另一个实现进行了比较。结果在近似有效的情况下重叠,并且在很长一段时间内都重叠。只有当方法严重崩溃时它们才会有所不同:

enter image description here

需要注意的是,欧拉方法对于这个特定的微分方程以及您希望达到的点来说效果不佳。 1/3 的步长一开始就太大了,但即使您选择更小的步长,例如 1/10000,该方法也容易崩溃在到达 t=10 之前下降。像 exp(t)sin(x) 这样的东西很难处理。真实的解变得平坦,接近 pi,因此 sin(x) 应该趋于零,从而使导数也为零。然而,exp(t) 会爆炸,因此导数在数值上不稳定。

关于java - java中的欧拉方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com