当我在Linux,Windows和联机编译器上运行这些源代码时,它总是提供不同的结果,但是我认为这两个源代码是相同的。请描述有关这些代码的任何想法。
第一个代码:
#include<iostream>
using namespace std;
int main()
{
double a=100.0,b=50.0,c=0.0,da,db,dc;
double k1=0.008,k2=0.002,delta=0.1,T=5.0,t,time=0.0;
int N;
t=(T/delta);
N=(int)t;
cout<<"Time"<<"\t"<<"A"<<"\t"<<"B"<<"\t"<<"C"<<"\t\n";
cout<<time<<"\t"<<a<<"\t"<<b<<"\t"<<c<<"\t\n";
for(int i=0;i<N;i++)
{
//Look the below line
a=a+(k2*c-k1*a*b)*delta;
b=b+(k2*c-k1*a*b)*delta;
c=c+(2*(k1*a*b-k2*c))*delta;
time+=delta;
cout<<time<<"\t"<<a<<"\t"<<b<<"\t"<<c<<"\t\n";
}
return 0;
}
第二个代码:
#include<iostream>
using namespace std;
int main()
{
double a=100.0,b=50.0,c=0.0,da,db,dc;
double k1=0.008,k2=0.002,delta=0.1,T=5.0,t,time=0.0;
int N;
t=(T/delta);
N=(int)t;
cout<<"Time"<<"\t"<<"A"<<"\t"<<"B"<<"\t"<<"C"<<"\t\n";
cout<<time<<"\t"<<a<<"\t"<<b<<"\t"<<c<<"\t\n";
for(int i=0;i<N;i++)
{
//Separate the previous code into two line.
da=k2*c-k1*a*b;
db=k2*c-k1*a*b;
dc=2*(k1*a*b-k2*c);
a=a+da*delta;
b=b+db*delta;
c=c+dc*delta;
time+=delta;
cout<<time<<"\t"<<a<<"\t"<<b<<"\t"<<c<<"\t\n";
}
return 0;
}
输出: 第一次迭代后:
first code gives : 0.1 96 46.16 7.09018
second code gives : 0.1 96 46 8
答案 0 :(得分:6)
请注意,在第一个清单中,当您为b赋予新值时,a的值已更改。
a=a+(k2*c-k1*a*b)*delta; //a is now different
b=b+(k2*c-k1*a*b)*delta;
^ now different
在第二个清单中,da,db和dc基于a,b和c的不变值进行计算。
da=k2*c-k1*a*b;
db=k2*c-k1*a*b;
^ ^ Still the same.