发点牢骚先……
我很气愤!
又有一个人对我说:“你很适合搞科研。”
这我忍了,结果,他觉得没有对我产生影响似的,又补充:“你应该去做科研,这个社会比你想象的复杂。”
我是比你嫩,但是谁不是从0开始的?难道谁刚生下来就懂了人情世故?那还不成了怪胎了。
子非鱼,安知鱼之乐乎!何况,一个人并不只是一定要做他“适合”做的事,更重要的,还要做他所热爱的事。姚明长得够高吧?要是做电工,布线的时候都不用搭梯子是吧?有做电工的得天独厚的优势是吧?那我要是对他说:“你应该去做电工。”他会怎么想?
有人又要说姚的相关专业知识不足了,我倒想说,我现在就能做出什么热力学、动力学理论?或是合成些化合物分析分析它的性质就能发到Science、Nature或者说是JACS上?一样的不能。
我只是一个大四的小孩,什么都不会,会的只是不停地学,那样以后才会有我真正“适合”做的,而我现在所做的,就是要让这个“适合做”与我热爱的成为同一件事。
我坚信:我不会因为放弃学院的保研资格而后悔,正如没有后悔过初三毕业时“宁做鸡头,不做凤尾”的选择一样!
好了。言归正传,昨天写了一点,算法有问题,今天先修改下:
郁闷,把方程改过来了,还是有问题。
tfull 是没问题的,但为什么 t 是负的……难道是迭代方法的问题?
A、B、C 的值与预期的相等,难道真是解方程的问题?
晕……居然写成 t=(C*exp(0.02*pret)-A)/B,明明该是 t=(A-C*exp(0.02*pret))/B,这样要没得到负的才错了!好了,改过来之后,数据都在正常的范围内了。
进一步,要验证它们是不是真的正确。
printf("\n%f\n",B*t+C*exp(0.02*t)-A); 显示293.384262,想想,A与Gold(t)同量纲,貌似在误差范围之内,除以B,得到的是以 hour 为单位的误差:293.4/393=44min……太大了。
难道是迭代未完成?怎么会连迭代用的方程都不满足。
printf("\n%f\n",t-(A-C*exp(0.02*pret))/B); 显示-0.000000
printf("\n%f\n",t-(A-C*exp(0.02*t))/B); 显示0.746525
printf("\n%f\n",t-pret); 显示0.881447
想想,应该是while(abs(pret-t)>=1.0/3600)的错了,
不可能是运算优先级问题吧, 不是,while(abs(pret-t)>=(1.0/3600))结果一样
printf("\n%f\n",abs(pret-t)); 显示0.000000
怎么搞的,abs不是求绝对值吗?难道是求整数的?记得以前看到过fabs,试试:
printf("\n%f\n",fabs(pret-t)); 显示0.881447
问题找到了,高兴!
while(fabs(pret-t)>=(1.0/3600)) 改过来之后,
printf("\n%f\n",fabs(pret-t)); 显示0.000267 正常了。
最后验算一下经过 t 之后的 Gold、material、luxury、research是否符合要求:
t=33.3372
matwork=36 material(t)=1254+36*33.3372=2454(needmat=5000)
luxwork=0 needlux与luxury相等,不用看了。
scient=12 research(t)=9+12*33.3372=409(needres=1204)
为什么会差这么多呢?要知道:
matwork=((needmat-material)/time+0.5);
luxwork=((needlux-luxury)/time+0.5);
scient=((needres-research)/time+0.5);
我个BC,此 t 非彼 t 也。要知道,最后显示了:4 days 7 hours 28 min 8 seconds,tfull~3.9<t;因此,t是满足下面的式子:
if(t<=tfull) return t;
gfull=getgfull(pop,satisfy,gold,tfull);
printf("\ngfull:%d\n",gfull);
t=tfull+((needgold-gfull)+3*(needmat-material)+3*(needlux-luxury)+9*(needres-research))/house;
当然,material、luxury、research都不会有问题了,关键的就是Gold(t);
Gold(t)=25212(needgold=15000) ……算法还有问题?
我这样迭代得到的 t 究竟是什么含义?
进一步检查,使用needmat==material(0)、needlux==luxury(0)、needres==research(0)的数据:
gold(0)==7000 needgold==10000
mat(0)==1250 needmat==1250
lux(0)==300 needlux==300
res(0)==100 needres==100
pop(0)==150 satisfy(0)==60 houses==200
哦额,time又是负的了……
这次这个方程是被满足了的。
化简方程,得:100-9t=300exp(0.02t)
如图所示,方程确实有唯一负数解。这表明微分方程可能又解错了。
satisfy(t)=satisfy(0)-(pop(t)-pop(0))=satisfy(0)+pop(0)-pop(t);
ds/dt=-dp/dt=-0.02s => s=s(0)exp(-0.02t); => p=s(0)+p(0)-s(0)exp(-0.02t);
dg/dt=3p=3(s(0)+p(0))-3s(0)exp(-0.02t); (t>0时,总有exp(-0.02t)<1,因此,dg/dt>3p(0))=>
g-g(0)=3(s(0)+p(0))*t+150s(0)(exp(-0.02t)-1)………………哇啊啊啊!居然是这里弄错了!!!
needgold-gold+3*(needmat-material)+3*(needlux-luxury)+9*(needres-research)+150*satisfy
=3*(pop+satisfy)*t+150*satisfy*exp(-0.02t)
终于,,正常了,,完成了。。
接下来,还要处理一些特殊数据,比如输入的needgold<=gold之类的情况,而且,一个好的界面才会使软件成功,我继续努力吧!