码迷,mamicode.com
首页 > 编程语言 > 详细

三种初步简易的方法求解数值问题 of C++

时间:2015-07-27 01:52:45      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

 

1. “二分法解方程”

  在二分法中,从区间[a,b]开始,用函数值f(a)与f(b)拥有相反的符号。如果f在这个区间连续,则f的图像至少在x=a,x=b之间穿越x轴一次,因此方程f(x)=0在[a,b]之间至少有一个解,通过逐步对[a,b]区间进行二分处理,选取在那一部分改变了符号,逐步缩小方程解的更小区域。

 1 /************************************************************************/
 2 /*二分法 解方程                                                          */
 3 /************************************************************************/
 4 double fun001(double x);
 5 int main() 
 6 {
 7     double acurace;
 8     cout << "请输入精度:eg(0.00001)";
 9     cin >> acurace;
10     double left, right;
11     do  
12     {
13         cout << "请输入有效的预期值的边界:";
14         cin >> left >> right;
15     } while (fun001(left) * fun001(right) >= 0.0);
16     double width = right - left,
17         midPt,funMidVal;
18 
19 
20     //求解
21     while (width/2 > acurace)
22     {
23         midPt = (left + right) / 2.0;
24         funMidVal = fun001(midPt);
25         if (fun001(left) * funMidVal < 0.0)
26         {
27             right = midPt;
28         } 
29         else
30         {
31             left = midPt;
32         }
33         width /= 2.0;
34     }
35 
36     cout << "二分法获取的方程的值是:" << midPt << endl;
37 
38 }

  还可以使用Newton-Raphson(牛顿-拉弗森)方法,对方程问题进行求解;

2.“逼近区域的面积”求数值积分问题

  一个常用的方法是,使用n-1个等距离的点x1、x2··· xn-1将区间[a,b]划分为n个等间隔的子区域,每个子区域的匡杜dealtaX = (b-a)/n。则对于曲线上的相应的点,使用线段链接相邻的点行程n个梯形。

  这些梯形的面积之和约定于曲线f(x)在区间[a,b]下的积分,使用梯形面积公式可以计算第i个梯形的面积为:((f(xi-1) + f(xi))* dealtaX)/2;

  将这些值相加整理的:dealtaX * (( y0 + yn)/2 + y1 + y2 + y3 ... + yn-1);

 1 /************************************************************************/
 2 /*       近似积分梯形法求解积分问题                                     */
 3 /************************************************************************/
 4 
 5 double funJiFen(double x);
 6 int main() 
 7 {
 8     int n;
 9     cout << "enter 需要对所积分的曲线划分成多少份 (n)";
10     cin >> n;
11     double a,b,deltaX, x,y,sum;
12     cout << "请输入所要积分的边界:(a)(b)";
13     cin >> a >> b;
14     deltaX = (b - a)/n;
15     sum = 0;
16     x = a;
17     for (int i = 1; i <= n - 1; i++)
18     {
19         x += deltaX;
20         y = funJiFen(x);
21         sum += y;
22     }
23     sum = deltaX * ((funJiFen(a) + funJiFen(b))/2 + sum);
24     cout << "在分成" << n << "等分的积分面积"<< sum << endl;
25 
26 }

  还可以使用:Simpson方法,这种方法思想是使用“抛物线代替梯形”求取面积;

3. 求解微分方程求解问题

  微分方程的定义:包含导数或者微分的方程称为微分方程;

  使用Euler(欧拉)方法求解微分方程

  给定一阶微分方程:y‘ = f(x,y);

  初始条件:y(x0) = y;

  在某个区间[a,b]且a = x0; (1) 选择x的增量dealtaX,(2)对n= 0,1,2,3...完成以下步骤:

    (i) 设xn+1 = xn + dealtaX;

    (ii) 通过点Pn(xn, yn),斜率为 f(xn,yn)的直线上找到点P(xn+1, yn+1),即求出下一点的横坐标yn+1,可以作为点xn+1在原函数的近似值;

    (iii)重复以上操作,知道在特定点即可获取微分方程问题;

 

  还可以利用更精确的方法求解微分方程问题,这里仅仅提供一种最简单的求解思路!

 

三种初步简易的方法求解数值问题 of C++

标签:

原文地址:http://www.cnblogs.com/icmzn/p/4679105.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!