#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;
}
Newton迭代法解非线性方程组的C语言实现
最新推荐文章于 2024-07-15 19:39:34 发布