Java 是我的euler';方法实现正确吗?

Java 是我的euler';方法实现正确吗?,java,numerical-methods,Java,Numerical Methods,我正在写代码,应该解决微分方程,这是已经给出了使用欧拉的方法。得到结果后,我将它们绘制在图表上。但是我得到了不正确的值 这是为了得到传递函数反馈响应。我已经尝试过用其他方法编写euler方法(结果相同)。我检查了几次微分方程是否写对了。我想知道问题是在这里还是其他地方。我想不出这个代码有什么问题 公共静态双输入信号(双t、双A、双f、int型信号){ 开关(信号类型){ 案例1: 返回A*cos(2*Math.PI*f*t); 案例2: 返回A*(2/Math.PI)*asin(sin(2*Ma

我正在写代码,应该解决微分方程,这是已经给出了使用欧拉的方法。得到结果后,我将它们绘制在图表上。但是我得到了不正确的值

这是为了得到传递函数反馈响应。我已经尝试过用其他方法编写euler方法(结果相同)。我检查了几次微分方程是否写对了。我想知道问题是在这里还是其他地方。我想不出这个代码有什么问题

公共静态双输入信号(双t、双A、双f、int型信号){
开关(信号类型){
案例1:
返回A*cos(2*Math.PI*f*t);
案例2:
返回A*(2/Math.PI)*asin(sin(2*Math.PI*f*t));
案例3:
返回一个*signum(sin(2*Math.PI*f*t));
违约:
打破
}
返回0;
}
公共静态双方程(双x,双x导数,双u,双D竞争,双a0,双a1,双b0,双b1,双b2){
返回(a1*udevivative+a0*u-(a0+b0)*x-(a1+b1)*x导数)/b2;
}
公共静态空隙欧拉法(双h、双A、双f、双a0、双a1、双b0、双b1、双b2、int型信号){
双xn=0,yn=0,tn=0,tn1;//x'=y;y'=f(x,y,u)
双重竞争;
对于(int i=0;i<10000;i++){
tn1=tn+h;
uDerivative=(输入信号(tn1+h,A,f,信号类型)-输入信号(tn1,A,f,信号类型))/h;
xn=xn+h*方程(xn,yn,pobudzenie(tn1,A,f,信号类型),微分方程,a0,a1,b0,b1,b2);
yn=yn+h*xn;
系统输出打印项次(“步骤”+i);
System.out.println(“Y(“+tn1+”)”+“=”+yn);
tn=tn1;
结果[i]=yn;
输入图形[i]=输入信号(tn、A、f、信号类型);
}
}
微分方程是:
b2*x'=a1*u'+a0*u-(a0+b0)*x-(a1+b1)*x'

对于
euler2(0.0025,1,0.01,1,5,1,2,1,1),我想要得到的是
,但我从代码中得到的是

正如您所看到的,我的函数有不希望出现的波动,其振幅低于预期值(它是0.2,而它应该是0.7)。

最可能的错误 你把一阶系统搞混了。你有

x'' = f(t,x,x',u,u')
设置
y=x'
这将导致一阶系统

x' = y
y' = f(t,x,y,u,u')
但是,您在计算
x
y
的更新时交换了右侧,有效地将等式更改为
x'=f(t,x',x,u')
,并显示
x'

在半显式Euler实现中,正确的方法实现是

yn = yn + h*equation(xn, yn, inputSignal(tn1, A, f, typeOfSignal), uDerivative, a0, a1, b0, b1, b2);
xn = xn + h*yn;
在严格的显式Euler实现中,您不会在
xn
更新中使用新计算的
yn
,而是使用旧值。需要涉及一些临时缓存变量


改进的一阶系统 通过设置

y=b2*x'+(a1+b1)*x-a1*u
那么

x' = ( y - (a1+b1)*x+a1*u )/b2;
y' = a0*u-(a0+b0)*x
从一阶系统中删除
u
的所有导数

可视化ODE求解器测试 如果为任一系统生成具有不同步长的绘图,则视觉收敛表示实现正确。那么,控制图的任何差异都意味着传递给此处解算器和控制解算器的ODE可能存在差异。

最可能的错误是 你把一阶系统搞混了。你有

x'' = f(t,x,x',u,u')
设置
y=x'
这将导致一阶系统

x' = y
y' = f(t,x,y,u,u')
但是,您在计算
x
y
的更新时交换了右侧,有效地将等式更改为
x'=f(t,x',x,u')
,并显示
x'

在半显式Euler实现中,正确的方法实现是

yn = yn + h*equation(xn, yn, inputSignal(tn1, A, f, typeOfSignal), uDerivative, a0, a1, b0, b1, b2);
xn = xn + h*yn;
在严格的显式Euler实现中,您不会在
xn
更新中使用新计算的
yn
,而是使用旧值。需要涉及一些临时缓存变量


改进的一阶系统 通过设置

y=b2*x'+(a1+b1)*x-a1*u
那么

x' = ( y - (a1+b1)*x+a1*u )/b2;
y' = a0*u-(a0+b0)*x
从一阶系统中删除
u
的所有导数

可视化ODE求解器测试
如果为任一系统生成具有不同步长的绘图,则视觉收敛表示实现正确。那么,控制图的任何差异都意味着传递给此处解算器和控制解算器的ODE可能存在差异。

请将代码中的名称翻译为英语,并格式化/缩进代码code@Clashsoft好了,我希望现在清楚了。很抱歉给您带来不便。请将代码中的名称翻译成英语,并格式化/缩进代码code@Clashsoft好了,我希望现在清楚了。很抱歉给您带来不便。