用弦截法求非线性方程23-42+3x-6=0在区间[0,3]的一个实根,精度为10-6。
刚才那个写的有点错误,方程写错了,修改如下:
float f(float x) // 求 y 函数
{
return 2*pow(x,3) - 4*pow(x,2)+3*x-6;
}
float newx(float x1, float x2) // 求 x 的下一迭代值
{
return x1-f(x1)*(x1-x2)/(f(x1)-f(x2));
}
float root(float x1, float x2) // 求根函数
{
float x, y, y1;
y1 = f(x1); // 先固定(x1,y1),并不断调整(x2,y2)
for(y = y1; fabs(y) >= 1e-6; ) // 循环求解,判断精度是否满足需求
{
x = newx(x1, x2); // 下一迭代值 x
y = f(x); // x 对应的 y 值
if(y*y1 > 0) // 如果新点(x,y)和(x1,y1)在 x 轴的同侧,则替换(x1,y1)
{
y1 = y;
x1 = x;
}
else
{
x2 = x;
}
}
return x;
}
int main()
{
float x;
x = root(0,3);
printf("%.2f",x);
return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!