【发布时间】:2018-08-28 12:35:41
【问题描述】:
我正在尝试使用欧拉方法来逼近一个微分方程:
u'=3*(u-t)
u(0)=1/3
问题应该在具有浮点精度的大量步骤中发散。这是由于初始数据的舍入误差。 对我的一些朋友来说,这段代码有分歧,但对我来说却没有。
编译器会不会提高精度?
评论更新:
@KillzoneKid no g++ -Wall -pedantic main.cpp 不打印任何内容
@some-programmer-dude 实际输出是精确解,而由于浮动错误,输出应该发散。类似 7189 而不是 10+ 1/3(精确解)
@pac0 编译后的输出不起作用,因为其他人都在使用非常旧的 linux 版本(内核 2.6),但我会尝试设置编译器选项。
趋势是使用 mac 的人(我的朋友)和使用现代 linux 的人(我)会遇到这个问题,而使用 windows 或非常旧的 linux 的人不会。
@1201ProgramAlarm 我在 XPS 15 上使用 ubuntu 17.10,并使用 CLion 作为编辑器。 为简单起见,我使用的是操作系统中捆绑的 g++。
#include <iostream>
#include <math.h>
#include <fstream>
using namespace std;
typedef float Real;
Real f(Real t,Real u);
const Real pi=4.0*atan(1.0);
int main() {
Real u,t,T,tau;
// print to file
char n_file[21]={0};
std::cout << "file name: " << std::endl;
std::cin >> n_file ;
ofstream prt(n_file);
prt.precision(15);
//
t=0.0;//start time
T=10.0;//final time
u=1.0/3.0;// u(0)
unsigned long N;
for(int k=1;k<=20;k++){
N=(unsigned long)pow(10,k);
tau=(T-t)/Real(N);
for(unsigned long n=1;n<=N;n++){
u+=tau*f(t,u);
t+=tau;
}
prt << "With " << N << " steps, at time " << tau << "result is " <<u<<endl;
prt << endl << endl << endl;
u = 1.0/3.0;
t = 0.0;
}
//
return 0;
}
//
Real f(Real t, Real u)
{
return 3*(u-t);
}
【问题讨论】:
-
您是否收到任何
double到float转换警告? -
对于一些输入(您需要告诉我们)预期的和实际输出是什么?你试过debug your code吗?
-
“对于我的一些朋友来说,这段代码是不同的”,如果你在你的机器上编译并给他们可执行文件,是否也有区别?
-
您使用的是哪个编译器/版本?和你朋友用的一样吗?
-
不清楚为什么你确定这应该“分歧”。
标签: c++ precision numerical-integration