BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / matlab / #11881同步于 2015/12/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖

各位大神们,小白我又来了,再次求助

you664
2015/12/30镜像同步11 回复
[ema1][ema1][ema1]真是不好意思,这么快又来求助了 是这样的,学了定积分应用后,表示对椭圆积分非初等很难受,于是百度了好久,有个回答说自己编程算,于是就试着写了写,先是用int写的,以这个来做标准答案,之后的只求出和他的差值,作为误差吧 pi=3.1415926535897; >> syms x >> f(x)=sqrt(1+(cos(x)^2)); >> vpa(int(f(x),0,2*pi)) ans = 7.6403955780551599138940427959356 再用MATLAB写一个定积分定义算他 pi=3.1415926535897; sum=0;a=0;n=8000000;b=2*pi; c=(b-a)/n; for i=a:c:b; d=sqrt((1+cos(i)^2)); sum=sum+c*d; end vpa(sum-7.6403955780551599138940427959356) ans = 0.0000011107188804260204051388427615166 误差挺小的了,但是我让朋友写了个c++的,同样的算法 #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<cstdio> #include<iomanip> using namespace std; const double pi=3.1415926535897; double l,r; int n; double ans; double hanshu(double x) { return sqrt(1.0+cos(x)*cos(x)); } int main() { double i,del; l=0;r=2.0*pi; while(cin>>n) { ans=0; del=(r-l)/(double)n; for(i=l;i<=r;i+=del) ans+=del*hanshu(i); cout<<fixed<<setprecision(20)<<ans-7.6403955780554240358095241643429<<endl; } return 0; } 然后再输入8000000输出的是 0.00000111071396613482 可以看到,同样的算法,为了避免pi位数造成的误差,对pi进行了同样的定义,然后MATLAB误差是7188什么什么的(原谅我前面没写吧),c++的误差是7139,在这个问题上用我这个算法时,MATLAB精度低于c++,是因为什么呢?[ema1][ema1][ema1] 大神们求教,是我算法不好么,还是我哪里写的不对,我听说MATLAB是c语言编写的,是这个原因么?还有,在这个过程中,我惊奇的发现,在MATLAB里,我取的那个n(代表分割的份数)扩大两倍,误差缩小一半,1000000到8000000中间都有这个规律,这是巧合还是必然结果?谢谢大神了 这周已经求助过两次了,怪不好意思,还是厚着脸皮来了,求大神们轻打 通过『我邮2.0』发布
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
you664机器人#1 · 2015/12/30
噢,c那个粘错了…有一步输出改成原来的值减MATLAB用int算的那个值,我错了[ema1]不要在意这个细节,我的锅,就是那个意思啦 再贴一遍c++的代码 #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<cstdio> #include<iomanip> using namespace std; const double pi=3.1415926535897; double l,r; int n; double ans; double hanshu(double x) { return sqrt(1.0+cos(x)*cos(x)); } int main() { double i,del; l=0;r=2.0*pi; while(cin>>n) { ans=0; del=(r-l)/(double)n; for(i=l;i<=r;i+=del) ans+=del*hanshu(i); cout<<fixed<<setprecision(20)<<ans-7.6403955780554240358095241643429<<endl; } return 0; } 0.00000111071396613482 【 在 you664 (石墨不是墨) 的大作中提到: 】 : [ema1][ema1][ema1]真是不好意思,这么快又来求助了 : 是这样的,学了定积分应用后,表示对椭圆积分非初等很难受,于是百度了好久,有个回答说自己编程算,于是就试着写了写,先是用int写的,以这个来做标准答案,之后的只求出和他的差值,作为误差吧 : pi=3.1415926535897; : ................... 通过『我邮2.0』发布
you664机器人#2 · 2015/12/30
不知道什么鬼…c++的粘过来就丢东西了…贴图好了,在楼下 【 在 you664 (石墨不是墨) 的大作中提到: 】 : [ema1][ema1][ema1]真是不好意思,这么快又来求助了 : 是这样的,学了定积分应用后,表示对椭圆积分非初等很难受,于是百度了好久,有个回答说自己编程算,于是就试着写了写,先是用int写的,以这个来做标准答案,之后的只求出和他的差值,作为误差吧 : pi=3.1415926535897; : ................... 通过『我邮2.0』发布
you664机器人#3 · 2015/12/30
【 在 you664 (石墨不是墨) 的大作中提到: 】 : [ema1][ema1][ema1]真是不好意思,这么快又来求助了 : 是这样的,学了定积分应用后,表示对椭圆积分非初等很难受,于是百度了好久,有个回答说自己编程算,于是就试着写了写,先是用int写的,以这个来做标准答案,之后的只求出和他的差值,作为误差吧 : pi=3.1415926535897; : ................... 通过『我邮2.0』发布
you664机器人#4 · 2015/12/30
呃呃呃,为啥,好诡异,在我邮里能不看到缺少的那部分…在贵邮里能看到…什么鬼[ema1][ema1][ema1]用我邮的学长们将就看吧,我想不出办法了 【 在 you664 (石墨不是墨) 的大作中提到: 】 : [upload=2][/upload][upload=1][/upload] : 通过『我邮2.0』发布 通过『我邮2.0』发布
dhown机器人#5 · 2015/12/31
我觉得问题是c++里边的double的精度太低了,只有20位有效数字,而MATLAB和c++算出来的值都比实际值要大,然后截尾的后果就是:c++要比MATLAB的算出来的结果更接近实际值(c++算的结果比MATLAB的结果小)。 待会儿用mathematica算了一下结果看看
you664机器人#6 · 2015/12/31
哇(⊙o⊙)哇学长说的好有道理,那如果我改进下算法,累加的时候,加的是f(xi)+f(x(i+1))/2(原谅我没有和我之前写的代码统一,学长应该能懂我的意思,就是每次都是加两个的平均),这样会不会精度高一些?不是单指这一个了,就是所有这种问题,这样取平均会不会精度比我那个都用左边的值高一些,又或者,用f(x(i+0.5))这样呢?哪个理论上更精确?还是因函数而异,有没有关于这个的学科谢谢学长 【 在 dhown (西伯利亚小仓鼠) 的大作中提到: 】 : 我觉得问题是c++里边的double的精度太低了,只有20位有效数字,而MATLAB和c++算出来的值都比实际值要大,然后截尾的后果就是:c++要比MATLAB的算出来的结果更接近实际值(c++算的结果比MATLAB的结果小)。 : 待会儿用mathematica算了一下结果看看 通过『我邮2.0』发布
dhown机器人#7 · 2015/12/31
【 在 you664 的大作中提到: 】 : 哇(⊙o⊙)哇学长说的好有道理,那如果我改进下算法,累加的时候,加的是f(xi)+f(x(i+1))/2(原谅我没有和我之前写的代码统一,学长应该能懂我的意思,就是每次都是加两个的平均),这样会不会精度高一些?不是单指这一个了,就是所有这种问题,这样取平均会不会精度比我那个都用左边的值高一些,又或者,用f(x(i+0.5))这样呢?哪个理论上更精确?还是因函数而异,有没有关于这个的学科谢谢学长 : : 通过『我邮2.0』发布 两个算出来的有效位数不一样,应该没法比较两者与真值的绝对值来确定哪个精度更高吧?一般认为有效位数越多,精度越高,但是也用可能有效位数多的那个值偏差更大。 但是具体精度涉及到截尾的,我自己也不清楚 例如MATLAB里边: a = 0.1; b = 0.2; c = 0.3; a+b==c a = 0.3; b = 0.4; c = 0.7; a+b==c 这两行代码的运行结果就很好玩
you664机器人#8 · 2016/1/1
嗯嗯,谢谢学长,我回头试试这个代码 【 在 dhown (西伯利亚小仓鼠) 的大作中提到: 】 : 两个算出来的有效位数不一样,应该没法比较两者与真值的绝对值来确定哪个精度更高吧?一般认为有效位数越多,精度越高,但是也用可能有效位数多的那个值偏差更大。 : 但是具体精度涉及到截尾的,我自己也不清楚 : 例如MATLAB里边: : ................... 通过『我邮2.0』发布
you664机器人#9 · 2016/1/2
format compact >> a=0.1;b=0.2;c=0.3;a+b==c ans = 0 >> a=0.3;b=0.4;c=0.7;a+b==c ans = 1 我去…等号等号是逻辑运算?判断真假吧…这是在逗我什么鬼啊 【 在 dhown (西伯利亚小仓鼠) 的大作中提到: 】 : 两个算出来的有效位数不一样,应该没法比较两者与真值的绝对值来确定哪个精度更高吧?一般认为有效位数越多,精度越高,但是也用可能有效位数多的那个值偏差更大。 : 但是具体精度涉及到截尾的,我自己也不清楚 : 例如MATLAB里边: : ................... 通过『我邮2.0』发布