- 注册时间
- 2009-2-12
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 22763
- 在线时间
- 小时
|
发表于 2011-1-12 13:06:21
|
显示全部楼层
本帖最后由 wayne 于 2011-1-12 13:29 编辑
我还是把我处理的过程详细的再过一遍吧,
我假设大家熟悉Mathematica语言:
一、把楼主给的方程用代数形式表达出来:
直接把方程复制到Mathematica是可以的,只是Mathematica默认会把系数理解成浮点数的形式,因此我们得先在每一个系数后面加一个NumberMark,告诉Mathematica这些是高精度的数,然后,才能 使用Rationalize函数进行有理化,代码如下:- f=Rationalize[-140.793343730037\`100 - 4979547.88364553\`100*g -
- 66100264505.6573\`100*g^2 + 389972903985224\`100*g^3 +
- 862777500000000000\`100*g^4 - 19782400000000000\`100*g^5 -
- 4151633333333.33\`100*g^6 + 9531285714285.71\`100*g^7 -
- 237271071428.571\`100*g^8 + 3126865079.36508\`100*g^9 -
- 25326190.4761905\`100*g^10 + 126654.545454545\`100*g^11 +
- 126654.545454545\`100*g^12 + 0.448194835664336\`100*g^13]
复制代码 二、解方程
对于Mathematica来说,这是再平凡不过的方程了,系数再怎么的大,只要你的机器硬件可以忍,它都可以忍,
代码:我在此加了分号,目的是不显示结果,因为这个结果是代数的形式表达的,太繁杂,没啥好看的。如果你好奇,可以去掉这个分号。如果你不放心这结果的正确性,可以用求值函数显示,比如我要看看这13个根的20位精度是个什么样子,代码:g /. N[ans, 20]
三、把上面的13个根按各种精度截取,回代入原方程,计算出误差- Table[{ii, SetPrecision[f /. Rationalize[SetPrecision[N[ans, ii], 1000]], 10]}, {ii, 10, 100, 10}] // Grid
复制代码 注意,按精度截取后,必须转换成代数的形式才回代进去,这样做能确保误差计算的高度精确.
输出会有点乱,末尾加的grid是为了格式化输出,如果你对那些误差很小,基本上都是10的-7 以下的那种数可以忽视的话,可以使用Chop函数,Chop[%],Chop函数只对很小很小的数感兴趣,它的作用是将很小很小的数置换成0
附件是nb文件:
5.nb
(36.92 KB, 下载次数: 0)
|
|