נשלח בתאריך: 14 September 2007 בשעה 22:00 | | IP רשוּם
|
|
|
|
חוץ מהשיטה ששושן הציע וחוץ מהשיטות הנומריות המקובלות (ניוטון רפסון, טרפז, חציה... ועוד ועוד) ישנה שיטה שמקרבת לשורש ע"י שימוש בהזזה של ביטים. לצערי הרב אני לא זוכר אותה אבל די בטוח שתצליח למצוא הסבר עליה ברשת.
דוגמה לניוטון רפסון וחציה בשפת C:
float F(float x, float m ){ // המשוואה ההומוגנית: x^2 - m = 0.
return x*x - m;
}
float NR(float m){ // שימוש בניוטון רפסון
float x0;
x0 = m/2;
int j = 0;
while((abs(m - x0*x0) >= 0.0000001) && (j < 10))
// ריצה 10 איטרציות או עד שימצא
// (שורש מספיק טוב (שגיאה 0.0000001
{
x0 = x0 - (F(x0,m)/(2*x0));
j++;
}
return x0;
}
float BM(float m){ // שימוש בשיטת החציה עד שגיאה של 0.0000001
float Rx;
float Lx = 0;
if (m < 1) Rx = 1; else Rx = m;
while (Rx - Lx > 0.0000001)
{
float mid = (Rx + Lx) /2;
if (mid == Rx || mid == Lx)
{
if ((m - Rx*Rx) < (m - Lx*Lx))
return Rx;
else return Lx;
}
if (F(mid,m) *F(Lx,m) > 0)
Lx = mid;
else
Rx = mid;
}
return Rx;
}
void main()
{
float num;
cout<<"Enter Number:"<<endl;
cin>>num;
cout<<"Newton Rafson method found:"<<NR(num)<<endl;
cout<<"Bisection method found:"<<BM(num)<<endl;
cout<<"The sqrt function found:"<<sqrt(num)<<endl;
}
|