返回信息流[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』发布
这是一条镜像帖。来源:北邮人论坛 / matlab / #11881同步于 2015/12/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖
各位大神们,小白我又来了,再次求助
you664
2015/12/30镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
噢,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』发布
不知道什么鬼…c++的粘过来就丢东西了…贴图好了,在楼下
【 在 you664 (石墨不是墨) 的大作中提到: 】
: [ema1][ema1][ema1]真是不好意思,这么快又来求助了
: 是这样的,学了定积分应用后,表示对椭圆积分非初等很难受,于是百度了好久,有个回答说自己编程算,于是就试着写了写,先是用int写的,以这个来做标准答案,之后的只求出和他的差值,作为误差吧
: pi=3.1415926535897;
: ...................
通过『我邮2.0』发布
【 在 you664 (石墨不是墨) 的大作中提到: 】
: [ema1][ema1][ema1]真是不好意思,这么快又来求助了
: 是这样的,学了定积分应用后,表示对椭圆积分非初等很难受,于是百度了好久,有个回答说自己编程算,于是就试着写了写,先是用int写的,以这个来做标准答案,之后的只求出和他的差值,作为误差吧
: pi=3.1415926535897;
: ...................
通过『我邮2.0』发布
呃呃呃,为啥,好诡异,在我邮里能不看到缺少的那部分…在贵邮里能看到…什么鬼[ema1][ema1][ema1]用我邮的学长们将就看吧,我想不出办法了
【 在 you664 (石墨不是墨) 的大作中提到: 】
: [upload=2][/upload][upload=1][/upload]
: 通过『我邮2.0』发布
通过『我邮2.0』发布
我觉得问题是c++里边的double的精度太低了,只有20位有效数字,而MATLAB和c++算出来的值都比实际值要大,然后截尾的后果就是:c++要比MATLAB的算出来的结果更接近实际值(c++算的结果比MATLAB的结果小)。
待会儿用mathematica算了一下结果看看
哇(⊙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』发布
【 在 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
这两行代码的运行结果就很好玩
嗯嗯,谢谢学长,我回头试试这个代码
【 在 dhown (西伯利亚小仓鼠) 的大作中提到: 】
: 两个算出来的有效位数不一样,应该没法比较两者与真值的绝对值来确定哪个精度更高吧?一般认为有效位数越多,精度越高,但是也用可能有效位数多的那个值偏差更大。
: 但是具体精度涉及到截尾的,我自己也不清楚
: 例如MATLAB里边:
: ...................
通过『我邮2.0』发布
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』发布