数值积分实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算方法》实验报告
实验四数值积分
二级学院:计算机学院
专业:计算机科学与技术
指导教师:爨莹
班级学号:
姓名:
实验一 非线性方程的迭代数值解法
1、 实验目的:
① 通过编程和插值与拟合中的某种具体算法解决具体问题,更深一步的体会计算方法这门课的重要性,同时加深对插值与拟合公式某种具体算法的理解。
② 熟悉编程环境。
2、实验要求:
实现插值与拟合中的某种具体算法编写并执行
3、实验内容:
1)用牛顿法求解01553=-x 的根,取初始值为10。
2) 用弦截法求解数学方程。
010*15.110*4.181.9*002.0)(255.15=--=--x x x f
4、题目: 非线性方程的迭代数值解法
5、原理:
1) 用牛顿法求解01553=-x 的根的原理:
牛顿迭代法是以微分为基础,用直线来代替曲线,由于曲线不规则,那么研究直线代替曲线后,剩下的差值是不是高阶无穷小,如果是高阶无穷小,,只用直线就可以了.。
牛顿迭代法是取初始值x0之后,过曲线y= f(x)上的点(x0, f(x0))做切线,切线方程为:y=f(x0)+f ’(x0)(x-x0), 它与x 轴交点横坐标x1 为
x1=x0-f(x0)/f ’(x0)
再过曲线y= f(x)上的点(x1, f(x1))做切线,切线方程为y=f(x1)+f ’(x1)(x-x1) 它与x 轴交点横坐标x2 为: x2=x1-f(x1)/f ’(x1)
如此做下去,第n+1条切线方程为:y=f(xn)+f ’(xn)(x-xn) 它与x 轴交点横坐标xn 为 Xn+1=Xn-f(Xn)/f ’(Xn)
在这个基础上,从而找到更接近方程根的近似跟。
2) 用弦截法求解数学方程
010*15.110*4.181.9*002.0)(255.15=--=--x x x f 的原理:
设 xk 、xk+1是f(x)=0的近似根,我们利用f(xk),f(xk+1)构造一次插值多项式p1(x), 并用p1(x)=0的根作为f(x)=0的新的近似根xk+1,
由于 p1(x)=f(xk)+f(xk)-f(xk-1)xk-xk-1(x-xk)(1)
因此有 xk+1=xk-f(xk)f(xk)-f(xk-1)(xk-xk-1)(2)
所以弦截法的几何意义为:依次用弦线代替曲线,用线性函数的零点作为函数零点的近似值
6、设计思想:
1)用牛顿法求解01553=-x 的根的基本思想是:
将非线性方程f(x)=0逐步转化为线性方程来求解,即依次用切线代替曲线,用线性函数的零点作为函数f(x)=0的近似值。
2)用弦截法求解根的基本思想是:
依次用弦线代替曲线,用线性函数的零点作为函数零点的近似值。
7、对应程序:
用牛顿法求解01553=-x
#include
#include
double F1(double);
double F2(double);
double Newton(double,double);
int main(int argc, int *argv[])
{ double x0 = 10.0;
double e = pow(10,-5);
printf("the result is %f\n",Newton(x0,e));
printf("pause");
}
double F1(double x)
{
return x*x*x-155 ;
}
double F2(double x)
{
return 3*x*x ;
}
double Newton(double x0, double e)
{
double x1;
do
{
x1 = x0;
x0 = x1 - F1(x1) / F2(x1);
}
while (fabs(x1 - x0) > e);
return x0;
}
用弦截法求解数学方程:
#include
#include
#include
using namespace std;
double f(double);
double xpoint(double,double);
double root(double,double);
int main()
{
double x1,x2,f1,f2,x;
do
{
cout<< "input x1,x2:";
cin >> x1 >> x2;
f1=f(x1);
f2=f(x2);
}
while(f1*f2 >= 0);
x = root(x1,x2);
cout << setiosflags(ios::fixed) << setprecision(7);
cout << "A root of equation is " << x << endl;
return 0;
}
double f(double x)
{
double y;
y=0.002*9.81-1.4*(1e-5)*sqrt(x*x*x)-1.15*x*x*(1e-5);
return y;
}
double xpoint(double x1,double x2)
{
double y;
y = ( x1 * f(x2) - x2 * f(x1))/(f(x2) - f(x1));
return y;
}
double root(double x1,double x2)
{
double x,y,y1;