zoukankan      html  css  js  c++  java
  • 三种初步简易的方法求解数值问题 of C++

    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)重复以上操作,知道在特定点即可获取微分方程问题;

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

  • 相关阅读:
    order by子句
    having和where的区别
    O2O模式为什么这么火
    高德----------百度地图
    list后台转化为JSON的方法ajax
    ajax中后台string转json
    ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
    压缩文件解压
    个人作业3——个人总结(Alpha阶段)
    第08周-集合与泛型
  • 原文地址:https://www.cnblogs.com/icmzn/p/4679105.html
Copyright © 2011-2022 走看看