回覆列表
-
1 # nklal14325
-
2 # 使用者5189701024573
對於求平方根,變成方程模式為f(x)=x^2-a,即求此方程的實根;
下面編寫了兩個function函式,可以直接呼叫。
二分法:
function x=sqrt_bisect(a)
f=@(x)x^2-a;
if a
warning(["負數不能求平方根"]);
x=[];
elseif a==0|a==1
x=a;
else
if a
xa=a;xb=1;
else
xa=1.00;xb=a;
end
while abs(xa-xb)>1e-6
x=(xa+xb)/2;
if f(xb)*f(x)>0
xb=x;
elseif f(xa)*f(x)>0
xa=x;
else
break
end
end
end
x;
牛頓迭代法:
function x=sqrt_newton(a)
f=@(x)x^2-a;
df=diff(sym("x^2-a"));
if a
warning("負數沒有實平方根");
x1=[];
elseif a==0;
x1=a;
else
x0=a;
x1=x0-f(x0)/subs(df,x0);
while abs(x1-x0)>1e-6
x0=x1;
x1=x0-f(x0)/subs(df,x0);
end
end
x=x1;
呼叫格式為:
sqrt_bisect(3)
ans =
1.7321
或者
sqrt_newton(2)
ans =
1.4142
對於求平方根,變成方程模式為f(x)=x^2-a,即求此方程的實根;下面編寫了兩個function函式,可以直接呼叫。二分法:function x=sqrt_bisect(a)f=@(x)x^2-a;if a1e-6 x=(xa+xb)/2; if f(xb)*f(x)>0 xb=x; elseif f(xa)*f(x)>0 xa=x; else break end endendx;牛頓迭代法:function x=sqrt_newton(a)f=@(x)x^2-a;df=diff(sym("x^2-a"));if a1e-6 x0=x1; x1=x0-f(x0)/subs(df,x0); endendx=x1;呼叫格式為:sqrt_bisect(3)ans = 1.7321或者sqrt_newton(2)ans = 1.4142