Newton迭代法解非线性方程组的C语言实现

#include<stdio.h>
#include<math.h>
 
#define tol -3   /*精度*/
/*--------------------
*方程组及一阶导数
--------------------*/
double f1(double x, double y){
	return x*x + y*y -1;
}
 
double f2(double x, double y){
	return x*x*x -y;
}
 
double f1_x(double x, double y){
	return 2*x;
}

double f1_y(double x, double y){
	return 2*y;
}

double f2_x(double x, double y){
	return 3*x*x;
}

double f2_y(double x, double y){
	return -1;
}
 
int main(void){
	unsigned int c_times = 1;
	double x_1,y_1,x_0,y_0;
	double n_tol=1;
	x_0 = 0.8;
	y_0 = 0.6;
	n_tol = pow((double)10,tol);  /*误差界限*/
 
	/*牛顿迭代*/
	while(1){
		x_1 = x_0 + (-f1(x_0,y_0)*f2_y(x_0,y_0) + f2(x_0,y_0)*f1_y(x_0,y_0))/(f1_x(x_0,y_0)*f2_y(x_0,y_0) - f2_x(x_0,y_0)*f1_y(x_0,y_0));
		y_1 = y_0 + (-f1(x_0,y_0)*f2_x(x_0,y_0) + f2(x_0,y_0)*f1_x(x_0,y_0))/(f1_y(x_0,y_0)*f2_x(x_0,y_0) - f2_y(x_0,y_0)*f1_x(x_0,y_0));
		printf("迭代次数:%d\t X的值:%-.20lg\t Y的值:%-.20lg\n",c_times,x_1,y_1);
		if((sqrt(pow((x_0-x_1),2) + pow((y_0-y_1),2))) < n_tol)
			break;
		x_0 = x_1;
		y_0 = y_1;
        c_times++;
 
	}
	printf("迭代次数:%d\n",c_times);
	printf("方程组解:\n");
	printf("%.20lg\t%.20lg\n",x_1,y_1);
	getchar();
	return 0;
}

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
newton迭代法是一种用于解非线性方程组的数值方法,可以通过MATLAB编程实现。下面给出一个简单的MATLAB程序来解决线性方程组。 ```matlab function [x, iter] = newton_iteration(F, J, x0, epsilon, max_iterations) % F为线性方程组的函数句柄,J为Jacobi矩阵的函数句柄,x0为初始解向量, % epsilon为收敛精度,max_iterations为最大迭代次数 % x为迭代解,iter为迭代次数 iter = 0; x = x0; while iter < max_iterations iter = iter + 1; delta = J(x) \ (-F(x)); x = x + delta; if norm(delta) < epsilon break; end end if iter == max_iterations fprintf('Reach maximum iterations without converging.\n'); end end ``` 在此程序中,`F`是线性方程组的函数句柄,`J`是Jacobi矩阵的函数句柄,`x0`是初始解向量,`epsilon`是收敛精度,`max_iterations`是最大迭代次数。该迭代函数会使用牛顿迭代法来计算线性方程组的解。 在迭代过程中,我们首先将迭代次数`iter`设为0,将初始解向量`x`设为`x0`。在每次迭代中,我们计算Jacobi矩阵的逆矩阵与线性方程组的负函数值之积,并将其称为`delta`。然后,更新解向量`x`为`x`加上`delta`。如果`delta`的范数小于收敛精度`epsilon`,则停止迭代。 最后,如果达到最大迭代次数而没有收敛,程序会显示一条警告信息。 使用该函数,你只需定义一个线性方程组的函数句柄和Jacobi矩阵的函数句柄,然后调用`newton_iteration`函数即可得到解向量`x`和迭代次数`iter`。 希望这个程序对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

作业不能白做

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值