【C零基础详解】迭代法开方和求方程的根【while循环的使用】

1. whiledo-while循环的使用方法:

while循环是一个常见且基础的循环,通常在给定约束条件的情况下使用,使用方法为:

while(exp) //无分号
	loop-body;

其中

  1. exp 表示执行循环语句时需要满足的条件
  2. loop-body 表示满足条件是执行的语句

汉语读法为:当满足exp的时候,执行loop-body

它的好兄弟do-while循环,在适用范围与其基本类似,唯一的区别在于do-while循环先执行再判断,需要执行至少一次,使用方法为:

do
{
 loop-body;
}while(exp); //有分号

汉语读法为:执行loop-body,直到不满足exp【注意顺序带来的差别】

2. 两个例子:

2.1 通过迭代法开平方根:

**已知:**平方根迭代满足如下公式:
x n + 1 = 1 2 ( x n + a x n ) x_{n+1} = \dfrac{1}{2}\left(x_{n}+\dfrac{a}{x_{n}}\right) xn+1=21(xn+xna)
其中 x 0 = a 2 x_{0} = \dfrac{a}{2} x0=2a,求解代码如下:

#include <stdio.h>

int main()
{
    const double ERROW = 1e-6; //误差精度(const 表示常量)
    double delta;
    double a, xn1, xn2; //迭代变量
    scanf("%lf", &a);

    xn2 = a/2;
    do
    {
        xn1 = xn2;                   //保存xn2的值
        xn2 = 0.5 * (xn1 + a / xn1); //迭代

        if (xn2 > xn1) 				 //通过条件语句实现绝对值
            delta = xn2 - xn1;
        else
            delta = xn1 - xn2;
    } while (delta > ERROW);

    printf("%.3lf", xn2);
    return 0;
}

2.2 通过牛顿迭代法求方程的根:

**已知:**设 x k x_{k} xk是方程 f ( x ) = 0 f(x) = 0 f(x)=0的精确解 x ∗ x^{*} x周围的一个点,过点 P k ( x k , f ( x k ) ) P_{k}(x_{k},f(x_{k})) Pk(xk,f(xk))做切线,改切线方程为
y = f ( x k ) + f ′ ( x k ) ( x − x k ) y = f(x_{k})+f'(x_{k})(x-x_{k}) y=f(xk)+f(xk)(xxk)
切线与 x x x轴的交点为 x k + 1 x_{k+1} xk+1,可以知道 x k + 1 x_{k+1} xk+1逐渐逼近精确解 x ∗ x^{*} x,计算机求解代码如下:

#include <stdio.h>
#include <math.h>

#define ESP 1e-7 //也可以用define:注意中间没有“=” 末尾没有“;”
int main()
{
    double x2, x1;
    double f, df; 
    
    x1 = 0;
    do
    {
        f = pow(x1, 4) - 4 * pow(x1, 3) + 6 * pow(x1, 2) - 8 * x1 - 8;
        df = 4 * pow(x1, 3) - 12 * pow(x1, 2) + 12 * x1 - 8;
        x2 = x1 - f / df; //切线方程的根
        x1 = x2;
    } while (fabs(f) >= ESP); //通过标准库函数实现绝对值
    
    printf("%.3lf\n", x2);
    return 0;
}

3. 总结与反思:

所谓的迭代法,通常可以用while循环来实现,其主要难点在于理清楚迭代的变量之间的相互关系。只要知道迭代公式,按照迭代公式的顺序进行书写,直到形成闭环即可。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值