當前位置:首頁 » 編程語言 » 弦截法c語言

弦截法c語言

發布時間: 2022-07-03 10:39:16

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 就可以得到正確結果了

熱點內容
java集合循環 發布:2024-04-27 01:17:18 瀏覽:593
解壓喪屍片 發布:2024-04-27 01:02:28 瀏覽:369
編程師加班 發布:2024-04-27 00:49:24 瀏覽:910
lol四川伺服器雲空間 發布:2024-04-27 00:42:08 瀏覽:934
卡宴怎麼看配置 發布:2024-04-27 00:41:08 瀏覽:941
央視影音緩存視頻怎麼下載視頻 發布:2024-04-27 00:25:55 瀏覽:583
手機緩存的視頻怎麼看 發布:2024-04-27 00:11:05 瀏覽:57
shell腳本平方計算公式 發布:2024-04-26 23:29:26 瀏覽:187
比較實惠的雲伺服器 發布:2024-04-26 23:24:57 瀏覽:974
怎麼增加電腦緩存 發布:2024-04-26 23:23:46 瀏覽:451