Java中的微分方程

Java中的微分方程,java,math,ode,differential-equations,Java,Math,Ode,Differential Equations,我试图用java创建一个简单的SIR流行病模型模拟程序 基本上,SIR由三个微分方程组定义: S'(t)=-l(t)*S(t) I’(t)=l(t)*S(t)-g(t)*I(t) R'(t)=g(t)*I(t) S-易感人群,I-感染人群,R-康复人群 l(t)=[c*x*I(t)]/N(t) c-接触人数,x-传染性(与患者接触后患病的概率),N(t)-总人口(这是常数) 我如何用Java来解这些微分方程?我认为我不知道任何有用的方法来做到这一点,所以我的实现产生了垃圾 public clas

我试图用java创建一个简单的SIR流行病模型模拟程序

基本上,SIR由三个微分方程组定义:
S'(t)=-l(t)*S(t)
I’(t)=l(t)*S(t)-g(t)*I(t)
R'(t)=g(t)*I(t)

S-易感人群,I-感染人群,R-康复人群

l(t)=[c*x*I(t)]/N(t)

c-接触人数,x-传染性(与患者接触后患病的概率),N(t)-总人口(这是常数)

我如何用Java来解这些微分方程?我认为我不知道任何有用的方法来做到这一点,所以我的实现产生了垃圾

public class Main {
public static void main(String[] args) {
    int tppl = 100;
    double sppl = 1;
    double hppl = 99;
    double rppl = 0;
    int numContacts = 50;
    double infectiveness = 0.5;
    double lamda = 0;
    double duration = 0.5;
    double gamma = 1 / duration;
    for (int i = 0; i < 40; i++) {
        lamda = (numContacts * infectiveness * sppl) / tppl;
        hppl = hppl - lamda * hppl;
        sppl = sppl + lamda * hppl - gamma * sppl;
        rppl = rppl + gamma * sppl;
        System.out.println (i + " " + tppl + " " + hppl + " " + sppl + " " + rppl); 
    }
}
公共类主{
公共静态void main(字符串[]args){
int-tppl=100;
双sppl=1;
双hppl=99;
双rppl=0;
int numContacts=50;
双重感染性=0.5;
双lamda=0;
双倍持续时间=0.5;
双伽马=1/持续时间;
对于(int i=0;i<40;i++){
lamda=(numContacts*传染性*sppl)/tppl;
hppl=hppl-拉姆达*hppl;
sppl=sppl+lamda*hppl-伽马*sppl;
rppl=rppl+伽马*sppl;
System.out.println(i+“”+tppl+“”+hppl+“”+sppl+“”+rppl);
}
}
}


我将非常感谢任何帮助,非常感谢

时间序列微分方程可以通过取dt=一个小数值,并使用以下几种方法之一(例如,或)进行数值模拟。Euler的方法可能很原始,但对于某些方程来说,它可以正常工作,而且非常简单,您可以尝试一下。e、 g:

S'(t)=-l(t)*S(t)

I’(t)=l(t)*S(t)-g(t)*I(t)

R'(t)=g(t)*I(t)

int N=100;
双精度[]S=新双精度[N+1];
双精度[]I=新双精度[N+1];
double[]R=新的double[N+1];
S[0]=/*初始值*/
I[0]=/*初始值*/
R[0]=/*初始值*/
double dt=总时间/N;
对于(int i=0;i<100;++i)
{
双t=i*dt;
双l=/*在这里计算l*/
双g=/*此处计算g*/
/*计算导数*/
双dSdt=-I[I]*S[I];
双dIdt=I[I]*S[I]-g*I[I];
双dRdt=g*I[I];
/*现在用欧拉积分*/
S[i+1]=S[i]+dSdt*dt;
I[I+1]=I[I]+dIdt*dt;
R[i+1]=R[i]+dRdt*dt;
}
最困难的部分是计算要使用多少步骤。你应该读一篇我链接到的文章。更复杂的微分方程解算器使用可变步长,以适应每一步的精度/稳定性

事实上,我建议使用数值软件,如R、Mathematica、MATLAB或Octave,因为它们包括ODE解算器,您不需要自己去解决所有问题。但是,如果您需要作为更大的Java应用程序的一部分来做这件事,至少先用数学软件来尝试一下,然后了解步长是多少,以及解算器是如何工作的


祝你好运

@hvgotcodes:???!?随便你。他得到的东西没那么复杂。“我们中的一些人对加密、正则表达式、web服务或UI消息处理也有同样的看法。”@jason。是 啊我想这取决于你接触过什么。我从来不用带戴克;在我的学校CS学位需要2个数值计算,而不是DEQ。。。
int N = 100;
double[] S = new double[N+1];
double[] I = new double[N+1];
double[] R = new double[N+1];

S[0] = /* initial value */
I[0] = /* initial value */
R[0] = /* initial value */

double dt = total_time / N;

for (int i = 0; i < 100; ++i)
{
   double t = i*dt;
   double l = /* compute l here */
   double g = /* compute g here */

   /* calculate derivatives */
   double dSdt = - I[i] * S[i];
   double dIdt = I[i] * S[i] - g * I[i];
   double dRdt = g * I[i];

   /* now integrate using Euler */
   S[i+1] = S[i] + dSdt * dt;
   I[i+1] = I[i] + dIdt * dt;
   R[i+1] = R[i] + dRdt * dt;
}