㈠ 用二分法求方程的根 下面的程序段有問題嗎
有很大問題啊。第一,除了判斷fabs(f(c))>0.002,還要判斷f(a)或f(b)的值是否滿足要求,當然這個可以通過變通而省略的。第二,用while(fabs(f(c))>0.002),有可能出現死循環的。
㈡ 請問一下python程序代碼錯在哪裡了,謝謝。是通過二分法求方程根的函數
代碼有兩個地方有問題
1:19行的return縮進有問題,19行的return不應該出現在一個非方法的地方
2:代碼有可能出現死循環,在我輸入a:10,b:10,c:10,d:10的時候出現死循環,請檢查代碼邏輯
我已經調整好了
deff(x):
s=(a*x)**3+(b*x)**2+(c*x)+d
returns
a=int(input("a"))
b=int(input("b"))
c=int(input("c"))
d=int(input("d"))
mid=0
foriinrange(-100,100,1):
x1=int(i)
x2=int(i+1)
iff(x1)*f(x2)<0:
lo,hi=x1,x2
whilehi-lo>0.01:
mid=(lo+hi)/2
iff(lo)*f(mid)<0:
hi=mid
else:
lo=mid
else:
pass
printmid
㈢ 二分法程序,哪裡有錯謝謝
查找的循環條件錯了
for(j=1;l==s;j++)意思是當l等於s時才繼續循環,明顯不符合邏輯啊。
你可以搜一下標準的二分查找程序,裡面一般是用
while(s<=l)或者for(;s<=l;)
㈣ C語言 二分法求方程近似解 ,運行沒反應,不知哪裡有問題,求指教
只有一個錯誤。f2 = f3;這句話,你賦值的是一個值,而不是一個表達式。需要改成f2 = (2*m*(m-2)+3)*m-6; 同理f1=f3也不對。
而且,感覺你這演算法也不對。求不出來值,是不是2分法跨度太大查不到。可以用弦截法。
float f(float x)
{
float y;
y=(2*x*(x-2)+3)*x-6;
return y;
}
float xpoint(float x1,float x2)
{
float y;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return y;
} 增加這樣兩個函數
m=xpoint(a,b);替換 二分法m=(a+b)/2。 就有結果了
對了 還有問題。
do
{
m = xpoint(a,b);
f3 = (2*m*(m-2)+3)*m-6;
if (f1*f2 < 0)
{
a =m;
f1 = (2*m*(m-2)+3)*m-6;
// cout<<f1<<endl;
}
else
{
b =m;
f2 = (2*m*(m-2)+3)*m-6;
//cout<<f2<<endl;
}
} while (fabs(f3)>=1e-5);
底下的循環,也就是賦值縮小區間的過程,你寫反了。f1*f2 < 0,這時a=m。f1*f2 >0,這時b=m。
㈤ 大家看看簡單的二分法,怎麼死循環了
如果我沒理解錯的話,你fun函數中的這句話
return 1.0*pow(x,2) + 0.0*x - 5.0;
不就是x*x-5.0么,這么簡單就不要再搞個函數了吧。。。。
所謂的fun(x1)*fun(x2)>0不就是說x1和x2的平方都大於5或者都小於5?
再來說你的二分,我覺得你就是要找個平方等於5的數是么?你的判斷:
fun(x1)*fun(mid)<0實際上就是說x1和mid這兩個數一個平方大於5另一個平方小於5(當然了,是x1小於,mid大於),這個時候你把x1賦予一個大於5的值mid,那麼現在x1、x2以及後來再有的mid都大於5了,你的fun函數怎麼可能收斂?
另外一種情況(兩個數都大於或者都小於),你把x2置為mid,那麼現在x1和x2或者都大於5或者都小於5,於是還是不收斂。
㈥ 關於二分法的小程序,大蝦幫幫忙。
兩個錯誤。
1、你把精確度設為1e-6。注意,float的有效數字只有6位,所以算到小數點後6位時,x1,x2,x的值很有可能就一樣了,那麼x,x1,x2的值將不將變化,而且肯定會大於1e-6,導致死循環。
解決方法是把所有數據改成double型。
2、仔細分析一下你的find函數吧,它求得的最後一個根區間有很大可能並不包含一個有效根。
比如我輸入-10 10,那麼,第一個根區間會是-10,-2,那麼第2個區間就成了-2,11,第2個區間並不包含根。
解決方法是在調用bin_root前,判斷一下polynomial(bot[i])*polynomial(top[i])<0
另外,你的find函數在生成最後一個根區間時,會出現x2比top1大1的情況。你自己改改吧。
我的代碼如下:
#include "math.h"
#include "stdio.h"
double polynomial(double x)
{//多項式函數,用於給定多項式形式
double y;
y=((3*x+6)*x-1)*x+2;
return y;
}//polynomial函數
int find(int *bot,int *top,int bot1,int top1)
{//根據多項式函數fun自動搜索求根區間,並把各個區間的上限和下限分別保存到top[]和bot[]數組中,返回包含根的區間個數
double y1,y2;
int x1,x2;
int count=0;
x1=bot1;
x2=bot1+1;
while(x2<=top1)
{
y1=polynomial((double)x1);
y2=polynomial((double)x2);
while(y1*y2>0&&x2<=top1)
{
x2++;
y2=polynomial((double)x2);
}
bot[count]=x1;
top[count]=x2;
count++;
x1=x2;
x2=x1+1;
}
return count;
}//find函數
double bin_root(int bot,int top)
{//函數功能,二分法求根
double y,y1,y2;
double x1=bot,x2=top,x;
x=(x1+x2)/2;
y=polynomial(x);
y1=polynomial(x1);
y2=polynomial(x2);
while(fabs(y)>=1e-6)
{
if(y*y1<0)
{
x2=x;
}
else
{
x1=x;
}
x=(x1+x2)/2;
y=polynomial(x);
y1=polynomial(x1);
y2=polynomial(x2);
}
return x;
}//二分法求根bin_root函數
void main()
{
int count,bot[10],top[10];
int bot1,top1;//由用戶輸入求根區間,程序自動找到該區間中存在的根的個數
int i;
double root;
printf("請輸入求根區間:\n");
scanf("%d%d",&bot1,&top1);
count=find(bot,top,bot1,top1);
if(count==0)printf("函數在您輸入的區間內無根:\n");
for(i=0;i<count;i++)
{
if(polynomial(bot[i])*polynomial(top[i])<0)
{
root=bin_root(bot[i],top[i]);
printf("函數在子區間[%d,%d]內的根為:%.4f\n",bot[i],top[i],root);
}
}
}
㈦ C語言編程,二分法求解函數,陷入死循環。請大神幫忙看看錯在哪裡
你的r是多少?
那些常量是多少?
Mae=d_a;
d_b=(d_a+d_b)/2;
d_difference=d_c;
printf("d_b=%f\n",d_b);
這段代碼只被執行了一次
㈧ 二分法查找數組中的數,這是什麼原因
你問題在於。mid要重置啊,當你的start和end變化之後要重置。要不然每一次運行之後會重復上一次的動作。比如mid=5,key<a[5],不改變mid的話就每一次都執行end=5-1=4,這樣就死循環了。
解決辦法:
在while中加入:mid=(start+end)/2
㈨ 二分法陷入死循環~
修改如下,不要在C程序中使用C++的元素,否則在ACM等測試系統上無法編譯!
//---------------------------------------------------------------------------
#include<stdio.h>
int s[1000002];
int main()
{
int n,m,i,j,x,y,z,mid;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%d",&s[i]);}
scanf("%d",&m);
for(j=1;j<=m;j++){
scanf("%d",&z);
x=0;y=n-1;
while(x<=y){
mid=(x+y)/2;
if(s[mid]>z)
y=mid-1;
else if(s[mid]<z)
x=mid+1;
else if(s[mid]==z){
printf("yes\n");
break;
}
else
printf("no\n");
}
}}
return 0;
}
//---------------------------------------------------------------------------