找回密码
 欢迎注册
查看: 33109|回复: 10

[求助] Mathematica赋值语句不工作

[复制链接]
发表于 2017-12-11 20:29:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
我写了一段代码,求不同精度下Log函数的值,结果发现,在循环体外,赋值语句不工作,总是显示“tag Times in `xxxx  is Protected. >>” , xxxx是要赋的值。
经过多次试验发现,仅仅循环外的第1条语句不工作。而且令人奇怪的是,在赋值语句之前插入一条一个Print语句,就可以正常工作了。下面是我的代码
  1. Print["Mathematica:",$VersionNumber];

  2. digArr={20,30,40,50,60,70,80,90,100,125,158,199,251,316,398,501,630,794,
  3.   1000,1258,1584,1995,2511,3162,3981,5011,6309,7943,10000,17782,31622,56234,100000};

  4. testTimes=7;
  5. For [i=1,i <= Length[digArr],i++,
  6.   prec=digArr[[i]];
  7.   n=IntegerPart[N[ 2^20/prec/Log10[prec]]];
  8.   x=N[Sqrt[3]-1,prec];
  9.   y=N[Sqrt[5],prec];
  10.   
  11.   j=n;
  12.   For [totalTime=0.0, totalTime<0.5, j*=2,
  13.         n=j;
  14.     totalTime=(Timing[Do[Log[x],{n}]][[1]]-AbsoluteTiming[Do[Null,{n}]][[1]]);
  15.    (* Print["n=",n];
  16.     Print["totalTime=",totalTime];*)
  17.   ]

  18.   For [minT=10^9; maxT=-10^9; timeSum=0.0;j=1,
  19.     j<= testTimes,j++,
  20.     (*totalTime=Timing[Do[Log[x],{n}]][[1]]-Timing[Do[Null,{n}]][[1]];*)
  21.     totalTime=AbsoluteTiming[Do[Log[x],{n}]][[1]]-AbsoluteTiming[Do[Null,{n}]][[1]];
  22.         (* AbsoluteTiming get more higher time resolution ratio *)
  23.     totalTime*=1000;
  24.     (*Print["totalTime is ",totalTime, "ms"];*)
  25.     timeSum += totalTime;
  26.     minT=Min[minT,totalTime];
  27.     maxT=Max[maxT,totalTime];
  28.   ]
  29. Print[""];
  30.   t=(timeSum-(minT+maxT))/(testTimes-2);
  31.   Print[prec,":took ",t/n, "ms (", n, " eval in ", t, "ms)" ];
  32. ]

复制代码


毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-12-11 20:35:52 | 显示全部楼层
关于程序的解释。
1. 程序求各种不同精度下的Log函数的耗时。
2. 每个精度下,测试7次,去掉一个最大值,去掉一个最小值,求其余5次测试的值。
3. 对于每次调用Log函数,首先做一个测试,求出一个合适的n值,使得重复调用n次Log函数所花费的时间大于0.5秒。
4. 在我的运行环境,如果去掉倒数第三行那个Print语句,其后的赋值语句不工作。与Print的内容无关,也与赋值语句等号左边和等号右边的内容无关。

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-12-12 16:08:17 | 显示全部楼层
各位 Mathematica 资深用户,能否帮我看看?,到底是什么问题,是我的环境的问题? 还是Mathematica的问题?还是我不了解Mathematica的某些特性而写的代码有问题?

点评

虽然我不用Mathematica,但是你可以试试换个表达式,或者赋值给别的变量,或者多写几条赋值语句,或者在外面套个if then else、for、while语句,然后再赋值,看看哪些情况work,哪些情况不work。  发表于 2017-12-12 16:17
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-12-13 09:44:11 | 显示全部楼层
我试了一下,没有任何问题
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-12-13 11:17:57 | 显示全部楼层
我在 WinXPSP3 & Mathematica9.0.1.0 下测试(原谅我还在用这么古老的系统),
即便注释掉第一行Print语句,运行也是正常的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-12-13 12:00:21 | 显示全部楼层
出现“tag Times in `xxxx  is Protected. >>” 应该是For后面没有加分号的原因;
第一个For改用Do更好,Do[something, {prec, digArr}]

点评

造成。基本上所有的For循环都可以改成更高效、更紧凑的Do循环。不知道为什么MM有一个For循环。  发表于 2017-12-13 15:29
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-12-14 09:02:38 | 显示全部楼层
gxqcn 发表于 2017-12-13 11:17
我在 WinXPSP3 & Mathematica9.0.1.0 下测试(原谅我还在用这么古老的系统),
即便注释掉第一行Print语句 ...

确实够老的,不过,我也挺保守的。如果没有发现什么问题,总不愿意用新的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-12-14 09:05:52 | 显示全部楼层
chyanog 发表于 2017-12-13 12:00
出现“tag Times in `xxxx  is Protected. >>” 应该是For后面没有加分号的原因;
第一个For改用Do更好,D ...

chyanog 和 hujunhua所言极是。增加一个分号,问题就解决了。
这是我的第一个Mathematica程序,带有明显的C语言风格。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-12-14 09:56:44 | 显示全部楼层
liangbch 发表于 2017-12-14 09:02
确实够老的,不过,我也挺保守的。如果没有发现什么问题,总不愿意用新的。


哈哈哈,我依然还是严重的更新党. 
琢磨了下,之所以喜欢更新,主要还是因为习惯从软件开发者的视角看,更新就是更加的新,^_^
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-24 10:14 , Processed in 0.026104 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表