永发信息网

c语言牛顿迭代法解 y=x三次方减去4倍的x的平方减去10等于0在1.0和-5附近的解要求误差小于10的-3次方

答案:3  悬赏:20  手机版
解决时间 2021-03-29 07:20
  • 提问者网友:兔牙战士
  • 2021-03-28 17:24
c语言牛顿迭代法解 y=x三次方减去4倍的x的平方减去10等于0在1.0和-5附近的解要求误差小于10的-3次方
最佳答案
  • 五星知识达人网友:爱难随人意
  • 2021-03-28 18:30
// 下面是方法和例子,自己去搞定。
牛顿迭代法,是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式 x(n+1) = g(x(n)) = x(n)–f(x(n))/f‘(x(n)).然后按以下步骤执行:
(1) 选一个方程的近似根,赋给变量x1;
(2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;
(3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就
认为是方程的根。
例1:已知f(x) = cos(x) - x。 x的初值为3.14159/4,用牛顿法求解方程f(x)=0的近似值,要求精确到10E-6。
算法分析:f(x)的Newton代法构造方程为:x(n+1) = xn - (cos(xn)-xn) / (-sin(xn)-1)。
#include

double F1(double x); //要求解的函数
double F2(double x); //要求解的函数的一阶导数函数
double Newton(double x0, double e);//通用Newton迭代子程序
int main()
{
double x0 = 3.14159/4;
double e = 10E-6;

printf("x = %f\n", Newton(x0, e));
getchar();
return 0;
}
double F1(double x) //要求解的函数
{
return cos(x) - x;
}
double F2(double x) //要求解的函数的一阶导数函数
{
return -sin(x) - 1;
}
double Newton(double x0, double e)//通用Newton迭代子程序
{
double x1;

do
{
x1 = x0;
x0 = x1 - F1(x1) / F2(x1);
} while (fabs(x0 - x1) > e);

return x0; //若返回x0和x1的平均值则更佳
}
例2:用牛顿迭代法求方程x^2 - 5x + 6 = 0,要求精确到10E-6。
算法分析:取x0 = 100; 和 x0 = -100;
f(x)的Newton代法构造方程为: x(n+1) = xn - (xn*xn – 5*xn + 6) / (2*xn - 5)

#include
double F1(double x); //要求解的函数
double F2(double x); //要求解的函数的一阶导数函数
double Newton(double x0, double e);//通用Newton迭代子程序

int main()
{
double x0;
double e = 10E-6;
x0 = 100;
printf("x = %f\n", Newton(x0, e));
x0 = -100;
printf("x = %f\n", Newton(x0, e));
getchar();
return 0;
}
double F1(double x) //要求解的函数
{
return x * x - 5 * x + 6;
}
double F2(double x) //要求解的函数的一阶导数函数
{
return 2 * x - 5;
}
double Newton(double x0, double e)//通用Newton迭代子程序
{
double x1;
do {
x1 = x0;
x0 = x1 - F1(x1) / F2(x1);
} while (fabs(x0 - x1) > e);

return (x0 + x1) * 0.5;
}
具体使用迭代法求根时应注意以下两种可能发生的情况:
(1) 如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;
(2) 方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导
致迭代失败。选初值时应使:|df(x)/dx|<1,|df(x)/dx|越小收敛速度越快!
全部回答
  • 1楼网友:長槍戰八方
  • 2021-03-28 19:30
在1.0和-5的附近都没解啊,
这个方程只有一个解, 大约4到5之间
#include
#include
int main(void)
{
double x1, x2;
double solve(double x);
double f(double n);
x1= solve(8.0);
x2= solve(-5.0);

printf("\nThe results are %.8f and %.8f",x1,x2);

system("PAUSE");
return 0;
}

double f(double n){
double res;
res=n*n*n-4*n*n-10;
return res;
}
double df(double n){
double res;
res=3*n*n-8*n;
return res;
}
double solve(double x){
double f(double n);
double df(double n);
while(fabs(f(x))>0.0001)
x-=f(x)/df(x);
return x;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯