C语言初试(二)

发点牢骚先……

 

  我很气愤!

  又有一个人对我说:“你很适合搞科研。”

  这我忍了,结果,他觉得没有对我产生影响似的,又补充:“你应该去做科研,这个社会比你想象的复杂。”

 

我是比你嫩,但是谁不是从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之类的情况,而且,一个好的界面才会使软件成功,我继续努力吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值