fun=@(x,y)ylog10(y)-x创建关于x,y的匿名函数
log10(x)由于Matlab中自然对数的符号是log(与我们数学上的不同),以10为底的对数符号是log10,同理有log2,但是没有log3等哦
vpa将得到的符号解转化为指定精度的小数,比如vpa('sqrt(2)',10)将sqrt(2)表示10位精度的小数
fzero是Matlab求解一元函数零点的内置函数
fsolve是Matlab中求解方程组解(可以求解复数)的内置函数,功能强于fzero
fval是返回fun(x)的值,也就是说fzero和fsolve返回方程的解x,那么此时的fun(x)就是fval
这个方法比较多 可以数值也可以解析求解
1解析求解
>> solve('ylog10(y)=3','y')
ans =
3log(10)/lambertw(3log(10))
>> vpa(ans)
ans =
45555357051951280236911974082484
2数值解法这个可以使用fsolve和fzero,前者的功能更加强大,但是对于这个问题fzero就可以了
>>x=3;
>>fun=@(y)ylog10(y)-x;
%使用fsolve
>> [x,fval]=fsolve(fun,rand)
Optimization terminated: first-order optimality is less than optionsTolFun
x =
45555
fval =
39620e-008
%使用fzero
>> [x,fval]=fzero(fun,5)
x =
45555
fval =
-88818e-016
函数的原理:
pi=1 - 1/2 + 1/4 - 1/6 + 1/8 - 1/10 +
无穷多项之和就等于pi,一般算到最后一项小于一定的数值即可,那就是精度,程序中的2e-6,当然也可以用1e-6或者1e-8等。
#include <stdioh>
void main(){
double i,k=1,pi=0,eps;
scanf("%le",&eps);
for(i=0;k>=eps;i++)
{
k=i==01:i/(i2+1);
pi+=k;
}
printf("pi=%5f",pi2);
}
利用“正多边形逼近”的方法求出π的近似值
程序说明与注释
#include<stdioh>
#include<mathh>
int main()
{
double e=01,b=05,c,d;
long int i; /i: 正多边形边数/
for(i=6;;i=2) /正多边形边数加倍/
{
d=10-sqrt(10-bb); /计算圆内接正多边形的边长/
b=05sqrt(bb+dd);
if(2ib-ie<1e-15) break; /精度达1e-15则停止计算/
e=b; /保存本次正多边形的边长作为下一次精度控制的依据/
}
printf("pai=%15lf\n",2ib); /输出π值和正多边形的边数/
printf("The number of edges of required polygon:%ld\n",i);
}
问题分析与算法设计
利用“正多边形逼近”的方法求出π值在很早以前就存在,我们的先人祖冲之就是用这种方法在世界上第一个得到精确度达小数点后第6位的π值的。
利用圆内接正六边形边长等于半径的特点将边数翻番,作出正十二边形,求出边长,重复这一过程,就可获得所需精度的π的近似值。
假设单位圆内接多边形的边长为2b,边数为i,则边数加倍后新的正多边形的边长为:
x=√——————
2-2√———
1-bb
——————
2
周长为:
y=2 i x i:为加倍前的正多边形的边数
我只想说这种方法求pi很不好,因为要精确到10^-6,需要做很多很多次循环,你可以尝试换别的公式来求pi,比如 pi=∑(4/(8n+1)-2/(8n+4)-1/(8n+5)-1/(8n+6))(1/16)^n
以上就是关于根据下图公式,用MATLAB编程函数求解pi的值,要求具体程序全部的内容,包括:根据下图公式,用MATLAB编程函数求解pi的值,要求具体程序、谁详细解释一下C语言求PI编程、C语言近似求PI,急!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)