(13)求近似数(如定积分、用牛顿迭代法或二分法或弦截法求多元方程的根)

文章介绍了如何使用矩形法计算函数f(x)=cosx在区间[0,1]上的定积分,并展示了牛顿迭代法和二分法求解方程根的过程。通过编程示例演示了这些数值计算技术的应用。
摘要由CSDN通过智能技术生成

矩形法求定积分

(将被积函数在积分区间上划分为若干个小矩形,并计算这些小矩形的面积之和作为定积分的近似值)

如:求f(x)=cosx 在区间[0,1]上的定积分

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

int main() {
    double f(double x);
    double rectangleMethod(double a, double b, int n);
    double a = 0.0;  // 积分下限
    double b = 1.0;  // 积分上限
    int n = 1000;  // 将积分区间分成1000个小矩形
    double result = rectangleMethod(a, b, n);
    printf("定积分的近似值为: %lf\n", result);
    return 0;
}
// 被积函数 f(x)=cosx
double f(double x) {
    return cos(x);  
}
// 矩形法求定积分
double rectangleMethod(double a, double b, int n) {
    double w = (b - a) / n;  // 计算每个小矩形的宽度
    double sum = 0.0;
    for (int i = 0; i < n; i++) {
        double x = a + i * w;  // 计算每个小矩形的左边界
        sum += f(x) * w;  // 计算每个小矩形的面积并累加
    }
    return sum;
}

牛顿迭代法求方程的根

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main() {
	double x0, x1;
	x0 = 1.5;
	x1 = x0 - (2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6) / (6 * x0 * x0 - 8 * x0 + 3);
	while (fabs(x1 - x0) >= 1e-5) {
		x0 = x1;
		x1= x0 - (2 * x0 * x0 * x0 - 4 * x0 * x0 + 3 * x0 - 6) / (6 * x0 * x0 - 8 * x0 + 3);
	}
	printf("方程在1.5附近的根为:%lf", x1);
	return 0;
}

二分法求方程的根

已知:

#include <stdio.h>
#include <math.h>
int main() {
	double left = -10, right = 10;
	double mid = 1.0*(left + right) / 2;   
	double c = 2 * mid * mid * mid - 4 * mid * mid + 3 * mid - 6;    
	while (fabs(c-0) >= 1e-5) {
		if (c >= 0) {
			right = mid;
			mid= 1.0 * (left + right) / 2;
			c = 2 * mid * mid * mid - 4 * mid * mid + 3 * mid - 6;
		}
		else if (c < 0) {
			left = mid;
			mid = 1.0 * (left + right) / 2;
			c = 2 * mid * mid * mid - 4 * mid * mid + 3 * mid - 6;
		}
	}
	printf("用二分法求方程在(-10,10)的根为:%lf", mid);
	return 0;
}

弦截法求方程的根

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

int main(){
    double f(double x);
    double root(double x1, double x2);
    double x1 = 0, x2 = 0;
    double x = 0;
    do{
        printf("input x1,x2:\n");
        scanf("%lf,%lf", &x1, &x2);
    }while (f(x1) * f(x2) >= 0);
    x = root(x1, x2);
    printf("方程的根为:%lf\n", x);
    return 0;
}
double f(double x){     //f(x)=x^3-5*x^2+16*x-80
    double y;
    y = x * x * x - 5 * x * x + 16 * x - 80;
    return y;
}
double root(double x1, double x2){
    double x, y, y1;
    y1 = f(x1);
    do{
        x = (x1 * f(x2) - x2 * f(x1)) / (f(x2) - f(x1));
        y = f(x);
        if (y * y1 >= 0) {
            x1 = x;
            y1 = y;
        }else {
            x2 = x;
        }
    } while ( fabs(y - 0) >= 1e-5);
    return x;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值