//用弦截法求一元三次方程的根x^3-5x^2+16x-80=0
#include<stdio.h>
#include<math.h>
float f(float x) //定義子函數f(x) = x^3-5x^2+16x-80,當f(x) →0時,則x即為所求的實數根;
{
float y;
y=((x-5.0)*x+16.0)*x-80.0;
return(y); //返回f(x)的值
}
float xpoint( float x1,float x2)//定義子函數xpoint,求出弦與x軸的交點的x0值;
{
float x0;
x0=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1)); //計算弦與x軸交點x0位置的值
return(x0); //返回x0位置的值
}
float root(float x1,float x2) //定義子函數root,求近似實根
{
float x0;
do //關鍵循環步驟,未達到條件前一直do循環運算;
{
x0=xpoint(x1,x2); //此處調用上面的子函數xpoint(x1,x2),得到弦與x軸交點位置x0的值
if(f(x0)*f(x1)>0) //此處調用子函數f(x),得到x軸x0位置的f(x0)值,得到x1位置的f(x1)值,如果f(x0)*f(x1)>0,即同符號的話;
x1=x0; //將x0賦值 →x1,則下次繼續循環運算的區間為x0(x1)-x2
else //否則,如果f(x0)*f(x1)<0,即異號的話;
x2=x0; //將x0賦值 →x2 ,則下次繼續循環運算的區間為x1-x0(x2)
}
while(fabs(f(x0))>=1e-6);//當型循環判斷條件,1e-6為取值精度,f(x0)接近於0,即接近於x軸相交,如運算無結果可能循環次數太多,可減少冪的次數再試。
return(x0); //返回x0位置的值
}
main() //主函數
{
float x1,x2,x0;
do
{
printf("請輸入預估的實根區間的兩個數值x1,x2:\n");
scanf("%f,%f",&x1,&x2); //輸入兩個數x1,x2
}
while (f(x1)*f(x2)==0);//當循環運算到f(x1)*f(x2)>=0時(0是必要條件參數),即f(x1)、f(x2)同符號,且任一個接近於0時,意味着與x軸接近相交,此時存在一個方程實根。
x0=root(x1,x2); //此處x0即為方程實根;
printf("其中的一個方程實根為:%.4f",x0);
}
舉個例子:x1=-10,x2=10,運算結果為: