弦截法c語言
1. c語言編程——用弦截法求一元三次方程的根。要求:由主函數調用求根子函數。最好是調試過的,謝謝了
代碼如下,其中代碼中系數已指定
#include <stdio.h>
#include <math.h>
void main()
{
float f(float x);
float root(float x1, float x2);
float xpoint(float x1,float x2);
float x1,x2,f1,f2,x;
do
{
printf("input x1,x2:\n");
scanf("%f,%f",&x1,&x2);
f1=f(x1);
f2=f(x2);
}while(f1*f2>=0);
x=root(x1,x2);
printf("A root of equation is %8.4f\n",x);
}
float root(float x1, float x2)
{
float xpoint(float x1,float x2);
float f(float x);
int i;
float x,y,y1;
y1=f(x1);
do
{
x=xpoint(x1,x2);
y=f(x);
if(y*y1>0)
{
y1=y;
x1=x;
}else
x2=x;
}while(fabs(y)>=0.0001);
return (x);
}
float f(float x)
{
float y;
y=((x-5.0)*x+16)*x-80;
return (y);
}
float xpoint(float x1,float x2)
{
float y;
y=(x1*f(x2)-x2*f(x1)) / (f(x2) - f(x1));
return (y) ;
}
2. c程序設計,用弦截法求方程的根。
#include <stdio.h>
#include <math.h>
void main()
{
float x0,x1,x2,y0,y1,y2;
printf("please input x1,x2:\n");
loop: scanf("%lf %lf",&x1,&x2);
y1=2*pow(x1,3)-4*pow(x1,2)+3*x1-6;
y2=2*pow(x2,3)-4*pow(x2,2)+3*x2-6; if (y1+y2>=y1)
{
printf("請重新輸入");
goto loop;
}
else
{
do
{ x0=(x1*y2-x2*y1)/(y2-y1);
y0=2*pow(x0,3)-4*pow(x0,2)+3*x0-6; if(y0*y1>0)
{
x1=x0;
y1=y0;
}
else
{
x2=x0;
y2=y0;
}
}
while(fabs(y0)>1e-6);
printf("%f",x0) ;
}
}
3. C語言弦截法求方程的根,實在是不知道錯哪了,求看看
fabs(f(xp))>=0.000001
精度太高算不出來,把0.000001改為0.001就可以了,或者把程序中所有的float改為double也行。
4. 弦截法的數學原理是什麼!!看了C語言里的一個例子,我實在不能理解謝謝
你知道一個方程的根的大致范圍[a,b],要求得更加確切的根。
1)你在[a,b] 之間找一個數 c。
2)如果你認為 數 c 已經足夠作為方程的根了(一般是精度夠了),那就找到了方程的根,退出。
3)否則,用找到的數字 c 分割區間 [a,b] , 於是有兩個新的范圍 [a,c],[c,b]。你進一步判斷方程的根是在 [a,c] 還是在 [c,b]之中。
如果判斷出方程的根是在 [a,c]之中,那麼另 b=c ,得到新的尋找根的范圍 [a,b] 回到 步驟1 。
如果判斷出方程的根是在 [c,b]之中,那麼另 a=c ,得到新的尋找根的范圍 [a,b] 回到 步驟1。
上面兩種情況,不論判斷出方程的根是在新的范圍 [a,c] 還是在 [c,b]之中,相比原來范圍 [a,b] ,尋找方程根的【范圍都縮小】了,也就更加容易找到方程的根了。這就是「極限「的思想。
具體是程序演算法是這么實現的:
有函數f(x)。
任取兩個數x1、x2,求得對應的函數值f(x1)、f(x2)。
如果兩函數值f(x1)、f(x2)同號,則重新取數,直到這兩個函數值異號為止。
因為 f(x1)、f(x2) 如果異號,那麼函數f(x) 在 [x1,x2] 的范圍內肯定和 x 軸相交,也就是
[x1,x2] 之間有方程的根。
1)連接(x1,f(x1))與(x2,f(x2)) 這兩點形成的直線與x軸相交於一點x『,求得對應的f(x』)。
2) 判斷 x' 是否已經能作為方程 f(x) 的根了(精度足夠了),如果是,退出。
3)否則判斷 f(x') 與f(x1)、f(x2)中的哪個值同號。
如f(x『)與f(x1)同號,則f(x』)為新的f(x1)。回到 步驟1。
如f(x『)與f(x2)同號,則f(x』)為新的f(x2)。回到 步驟1。
程序的步驟 1,2,3 和上面的說明中的1,2,3是一一對應的。
5. c語言設計程序用弦截法求根
#include<math.h>
#include<stdio.h>
float f(float x)
{ //計算f(x)的值
return 2*x*x*x-4*x*x+3*x-6;
}
float point(float x1,float x2)
{
//計算與x軸交點的x值
return (x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
}
int main()
{
//輸入兩個數x1,x2
float x1,x2,x;
do
{
printf("輸入兩個數x1,x2:");
scanf("%f%f",&x1,&x2);
}while (f(x1)*f(x2)>= 0); // 當輸入兩個數大於0為真時,繼續重新輸入
//關鍵循環步驟:
do
{
x=point(x1,x2);//得到交點的值
if(f(x)*f(x1)>0)
x1=x;//新的x1
else
x2=x;
}while (fabs(f(x)) > 0.0001); //0.0001為取值精度
printf("一個解為%f\n",x);
}
6. 請問c語言中弦截法怎麼理解
先說方程的根,x^3-5x^2+16^x-80=0,左側看成一個關於x的函數f(x),因此求方程的根就是在求函數f(x)圖像與x軸交點(即f(x)=0時x的取值)
然後是斜截法,其思想就是 f(x)是一段弧線,用一段線段代替它求得近似根,再以這個根作為線段的起點求一個更近似的根。圖中第二步的那個公式是用解析的方法表示線段的根,如果這個你也看不懂建議跳過這段或者先學習數學解析幾何
再說最後那段代碼,((x-5)*x+16)*x-80在數學上與x^3-5x^2+16^x-80完全相等,這難道不是顯然的嗎?至於為什麼不寫成x^3的形式,是因為前者運算量更小,運算更快(不信自己拿紙筆算一算試試),順便一提,這個叫做秦九韶演算法,是多項式求值的最快演算法
7. C語言弦截法與二分法求方程的解的比較
共同點:
針對求方程根,都是極限的思想
最後的值不斷靠近真值
但是方程有整數根,二分法和弦截法求得的值仍然是極限值,得不到整數
弦截法選取的x1和x2必須包含真值
二分法的區間(a,b)也必須包含真值
速度其實差不多
用精度來確定最後的值,不能f(x)==0來確定最後值,
因為不是int型,極限的思想也不能是int型
不同點:
弦截法只針對本方程問題
而二分法的思想卻有很多應用
因為它就是把問題一切為2,那邊靠近答案往那邊走
這樣解決問題就很快
比如二分法查找
8. 用弦截法求解一元三次方程的根(利用c語言實現)
我只看了你的第二個
你定義的f函數只有一個形參x,所以在main函數中輸入的你所認為的實參abcd 的值無法轉給f函數 所以運行時會出錯 只要賦給abcd確定的值或增加f函數的形參
scanf("%f,%f,%f,%f",&d,&d,&d,&d);這句也錯了應該是scanf("%f,%f,%f,%f",&a,&b,&c,&d);
9. c語言 弦截法求根
演算法沒有問題
問題出在精度上
float精度不足 導致計算到一定精度時進入浮點陷阱
把所有的float定義改為double 輸入輸出對應用%lf 就可以得到正確結果了