计算方法实验一
- 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 的根的原理:
牛顿迭代法是以微分为基础的,微分就是用直线来代替曲线,由于曲线不规则,那么我们来研究直线代替曲线后,剩下的差值是不是高阶无穷小,如果是高阶无穷小,那么这个差值就可以扔到不管了,只用直线就可以了,这就是微分的意义。 牛顿法是牛顿在17世纪提出的一种求解方程f(x)=0.多数方程不存在求根公式,从而求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。 牛顿迭代法是取x0之后,在这个基础上,找到比x0更接近的方程的跟,一步一步迭代,从而找到更接近方程根的近似跟。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。
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 的根,取初始值为10
#include
#include
double M1(double);
double M2(double);
double Newton(double,double);
int main(int argc, int *argv[])
{ double a1 = 10.0;
double c = pow(10,-5);
printf("the result is %f\n",Newton(a1,c));
printf("pause");
}
double M1(double a)
{return a*a*a-155 ;
}
double M2(double a)
{ return 3*a*a ;
}
double Newton(double a1, double c)
{ double a2;
do
{ a2 = a1;
a1 = a2 - M1(a2) / M2(a2);
}while (fabs(a2 - a1) > c);
return a1;
}
用弦截法求解数学方程:
#include
#include
#include
using namespace std;
double c(double);
double xpoint(double,double);
double root(double,double);
int main()
{ double a1,a2,c1,c2,a;
do
{ cout<< "input a1,a2:";
cin >> a1 >> a2;
c1=c(a1);
c2=c(a2);
} while(c1*c2 >= 0);
a = root(a1,a2);
cout << setiosflags(ios::fixed) << setprecision(7);
cout << "A root of equation is " << a << endl;
return 0;
}
double c(double a)
{ double b;
b=0.002*9.81-1.4*(1e-5)*sqrt(a*a*a)-1.15*a*a*(1e-5);
return b;
}
double xpoint(double a1,double a2)
{ double b;
b = ( a1 * c(a2) - a2 * c(a1))/(c(a2) - c(a1));
return b;
}
double root(double a1,double a2)
{ double a,b,b1;
b1 = c(a1);
do
{ a = xpoint(a1,a2);
b = c(a);
if(b*b1 > 0)
{ b1 = b;
a1 = a;
}
else
a2 = a;
}while(fabs(b)>= 0.00001);
return a;
}
8、实验结果:
01553=-x 的根是 X= 5.3716854
010*15.110*4.181.9*002.0)(255.15=--=--x x x f 的根是 X= 37.734196
9、图形(如果可视化)
牛顿法:
弦截法:
10、实验体会:
第一次用C 语言编写计算方法方面的程序,感觉很难,很多次都想放弃了,不过最后将问题解决了,一种说不出的成就感。插值与拟合中的牛顿法和弦截法都是通过对图形的观察和实际计算方法的运用,从而解决一些复杂的数值问题,我们应熟练掌握它,将其运用于我们的实际生活中。