积分如何计算
10个回答
展开全部
这是一段可以对任意一个一元函数进行数值积分的vbs代码,不仅可以算有限区间上的积分,还能计算无限区间上的广义积分,有效数位可以自由选择,最高达12位。新建一个文本文档,复制粘贴这段代码,另存为“积分器.vbs”,双击即可运行。
--------------------------------------------------------------------------------------------------------------------
PI=4*atn(1)
EN=exp(1)
function arcsin(x)
if abs(x)=1 then
arcsin=sgn(x)*PI/2
else
arcsin=atn(x/sqr(-x*x+1))
end if
end function
function arccos(x)
if x=1 then
arccos=0
elseif x=-1 then
arccos=PI
else
arccos=atn(-x/sqr(-x*x+1))+PI/2
end if
end function
function arctan(x)
arctan=atn(x)
end function
function hsin(x)
hsin=(exp(x)-exp(-x))/2
end function
function hcos(x)
hcos=(exp(x)+exp(-x))/2
end function
function htan(x)
htan=(exp(x)-exp(-x))/(exp(x)+exp(-x))
end function
function aexp(a,x)
aexp=exp(x*log(a))
end function
function logn(n,x)
logn=log(x)/log(n)
end function
function h(u)
dim s(),q()
dim t(2),f(2)
dim a(),b()
redim q(u)
n=u
for i0=0 to n
on error resume next
err.clear
q(i0)=0
k=2^i0
e=(b0-a0)/k
redim a(k-1)
redim b(k-1)
redim s(k-1)
for j=0 to k-1
a(j)=a0+j*e
b(j)=a(j)+e
t(0)=-sqr(3/5)
t(1)=0
t(2)=sqr(3/5)
for r=0 to 2
x=((b(j)-a(j))*t(r)+b(j)+a(j))/2
f(r)=eval(hs)
next
s(j)=e*(5*(f(0)+f(2))+8*f(1))/18
q(i0)=q(i0)+s(j)
next
next
m=1
do while n>0
on error resume next
err.clear
for i0=0 to n-1
q(i0)=((2^m)*q(i0+1)-q(i0))/(2^m-1)
next
n=n-1
m=m+1
loop
h=q(0)
end function
function pk
u=1
p2=h(1)
diff=1
do until diff<=1*10^(-(dr+3))
if pk>1e100 then
pk=2e100
exit do
elseif u>15 then
exit do
elseif abs(b0-a0)/(2^u)<1e-100 then
exit do
end if
p1=p2
p2=h(u+1)
if abs(p2)<1e-100 then
diff=0
pk=0
else
diff=abs((p2-p1)/p2)
u=u+1
pk=p2
end if
loop
end function
hs=inputbox("请输入被积函数:f(x)=","204的幽灵","x")
a0=inputbox("请输入积分下限a=","204的幽灵",1)
b0=inputbox("请输入积分上限b=","204的幽灵",2)
dr=inputbox("请输入有效位数n" & chr(10) & "n∈[1,12]","204的幽灵",8)
d=1
if a0="-w" and b0="+w" then
i=0
p=0
a0=0
b0=10
p=pk
a0=-10
b0=0
p=p+pk
g=1
do until g<=p*10^(-(dr+3))
if p>1e100 then
p=2e100
exit do
elseif p<-1e100 then
p=-2e100
exit do
elseif i>10 then
p="???"
msgbox "请检查f(x)广义积分是否存在",48,"204的幽灵"
exit do
end if
a0=-a0
b0=a0+2^i
g1=pk
p=p+g1
v=-a0
a0=-b0
b0=v
g2=pk
p=p+g2
i=i+1
g=abs(g1)+abs(g2)
loop
p0=p
p2=p
elseif a0="-w" then
p=0
i=0
a0=b0-10
p=pk
g=1
do until abs(g)<=p*10^(-(dr+3))
if p>1e100 then
p=2e100
exit do
elseif p<-1e100 then
p=-2e100
exit do
elseif i>10 then
p="???"
msgbox "请检查f(x)广义积分是否存在",48,"204的幽灵"
exit do
end if
b0=a0
a0=b0-2^i
g=pk
p=p+g
i=i+1
loop
p0=p
p2=p
elseif b0="+w" then
p=0
i=0
b0=a0+10
p=pk
g=1
do until abs(g)<=p*10^(-(dr+3))
if p>1e100 then
p=2e100
exit do
elseif p<-1e100 then
p=-2e100
exit do
elseif i>10 then
p="???"
msgbox "请检查f(x)广义积分是否存在",48,"204的幽灵"
exit do
end if
a0=b0
b0=a0+2^i
g=pk
p=p+g
i=i+1
loop
p0=p
p2=p
else
a0=eval(a0)
b0=eval(b0)
if a0>b0 then
v=b0
b0=a0
a0=v
d=-1
end if
p=pk
if p=0 then
p2=1
p0=0
else
p2=p
p0=p2
end if
end if
if isnumeric(p0) then
if p0>1e100 then
msgbox "∫f(x)dx=+∞",64,"204的幽灵"
elseif p0<-1e100 then
msgbox "∫f(x)dx=-∞",64,"204的幽灵"
else
z=int(logn(10,abs(p2)))
p0=p0/(1*10^z)
p0=round(p0,(dr-1))
p0=d*p0*10^z
msgbox ("∫f(x)dx=" & p0),64,"204的幽灵"
end if
else
msgbox ("∫f(x)dx=" & p0),64,"204的幽灵"
end if
-------------------------------------------------------------------------------------------------------------------
注释:(1)按提示输入被积函数f(x),f(x)由基本初等函数构成,具体输入如下:
1.三角函数:sin(x);cos(x);tan(x);
2.反三角函数:arcsin(x);arccos(x);arctan(x);
3.双曲三角函数:hsin(x);hcos(x);htan(x);
4.对数函数:logn(n,x)其中n表示底数,如logn(10,5)表示以10为底对5求对数;
5.指数函数:aexp(a,x)其中a表示底数,如aexp(3,11)表示3的11次方;
6.其他函数:绝对值abs(x);开方sqr(x);e的次x幂exp(x);自然底数对数log(x);
7.运算符号:加(+);减(-);乘(*);除(/);幂(^);
8.注意以上函数中的括号不能省略,比如exp(-(x^2))中的括号就不能省略;
9.PI表示圆周率;EN表示自然底数。
(2)输入积分上下限(可以输入计算式),PI表示圆周率,EN表示自然底数,-w表示负无穷,+w表示正无穷;
(3)输入有效数位(1到12间的任意一个整数);
(4)计算广义积分时,建议先将有效数位调低一些,如果结果是无穷大,就不必计算了,如果是有限数字,提高有效数位再次计算;
(5)代码内添加了防止“死循环”的代码,所以不会出现死循环,如果某次计算耗时太长(一般不会出现这种情况,两三秒内就能搞定),想中断计算,按Ctrl+Alt+del呼出任务管理器,结束wscript.exe进程即可。
--------------------------------------------------------------------------------------------------------------------
PI=4*atn(1)
EN=exp(1)
function arcsin(x)
if abs(x)=1 then
arcsin=sgn(x)*PI/2
else
arcsin=atn(x/sqr(-x*x+1))
end if
end function
function arccos(x)
if x=1 then
arccos=0
elseif x=-1 then
arccos=PI
else
arccos=atn(-x/sqr(-x*x+1))+PI/2
end if
end function
function arctan(x)
arctan=atn(x)
end function
function hsin(x)
hsin=(exp(x)-exp(-x))/2
end function
function hcos(x)
hcos=(exp(x)+exp(-x))/2
end function
function htan(x)
htan=(exp(x)-exp(-x))/(exp(x)+exp(-x))
end function
function aexp(a,x)
aexp=exp(x*log(a))
end function
function logn(n,x)
logn=log(x)/log(n)
end function
function h(u)
dim s(),q()
dim t(2),f(2)
dim a(),b()
redim q(u)
n=u
for i0=0 to n
on error resume next
err.clear
q(i0)=0
k=2^i0
e=(b0-a0)/k
redim a(k-1)
redim b(k-1)
redim s(k-1)
for j=0 to k-1
a(j)=a0+j*e
b(j)=a(j)+e
t(0)=-sqr(3/5)
t(1)=0
t(2)=sqr(3/5)
for r=0 to 2
x=((b(j)-a(j))*t(r)+b(j)+a(j))/2
f(r)=eval(hs)
next
s(j)=e*(5*(f(0)+f(2))+8*f(1))/18
q(i0)=q(i0)+s(j)
next
next
m=1
do while n>0
on error resume next
err.clear
for i0=0 to n-1
q(i0)=((2^m)*q(i0+1)-q(i0))/(2^m-1)
next
n=n-1
m=m+1
loop
h=q(0)
end function
function pk
u=1
p2=h(1)
diff=1
do until diff<=1*10^(-(dr+3))
if pk>1e100 then
pk=2e100
exit do
elseif u>15 then
exit do
elseif abs(b0-a0)/(2^u)<1e-100 then
exit do
end if
p1=p2
p2=h(u+1)
if abs(p2)<1e-100 then
diff=0
pk=0
else
diff=abs((p2-p1)/p2)
u=u+1
pk=p2
end if
loop
end function
hs=inputbox("请输入被积函数:f(x)=","204的幽灵","x")
a0=inputbox("请输入积分下限a=","204的幽灵",1)
b0=inputbox("请输入积分上限b=","204的幽灵",2)
dr=inputbox("请输入有效位数n" & chr(10) & "n∈[1,12]","204的幽灵",8)
d=1
if a0="-w" and b0="+w" then
i=0
p=0
a0=0
b0=10
p=pk
a0=-10
b0=0
p=p+pk
g=1
do until g<=p*10^(-(dr+3))
if p>1e100 then
p=2e100
exit do
elseif p<-1e100 then
p=-2e100
exit do
elseif i>10 then
p="???"
msgbox "请检查f(x)广义积分是否存在",48,"204的幽灵"
exit do
end if
a0=-a0
b0=a0+2^i
g1=pk
p=p+g1
v=-a0
a0=-b0
b0=v
g2=pk
p=p+g2
i=i+1
g=abs(g1)+abs(g2)
loop
p0=p
p2=p
elseif a0="-w" then
p=0
i=0
a0=b0-10
p=pk
g=1
do until abs(g)<=p*10^(-(dr+3))
if p>1e100 then
p=2e100
exit do
elseif p<-1e100 then
p=-2e100
exit do
elseif i>10 then
p="???"
msgbox "请检查f(x)广义积分是否存在",48,"204的幽灵"
exit do
end if
b0=a0
a0=b0-2^i
g=pk
p=p+g
i=i+1
loop
p0=p
p2=p
elseif b0="+w" then
p=0
i=0
b0=a0+10
p=pk
g=1
do until abs(g)<=p*10^(-(dr+3))
if p>1e100 then
p=2e100
exit do
elseif p<-1e100 then
p=-2e100
exit do
elseif i>10 then
p="???"
msgbox "请检查f(x)广义积分是否存在",48,"204的幽灵"
exit do
end if
a0=b0
b0=a0+2^i
g=pk
p=p+g
i=i+1
loop
p0=p
p2=p
else
a0=eval(a0)
b0=eval(b0)
if a0>b0 then
v=b0
b0=a0
a0=v
d=-1
end if
p=pk
if p=0 then
p2=1
p0=0
else
p2=p
p0=p2
end if
end if
if isnumeric(p0) then
if p0>1e100 then
msgbox "∫f(x)dx=+∞",64,"204的幽灵"
elseif p0<-1e100 then
msgbox "∫f(x)dx=-∞",64,"204的幽灵"
else
z=int(logn(10,abs(p2)))
p0=p0/(1*10^z)
p0=round(p0,(dr-1))
p0=d*p0*10^z
msgbox ("∫f(x)dx=" & p0),64,"204的幽灵"
end if
else
msgbox ("∫f(x)dx=" & p0),64,"204的幽灵"
end if
-------------------------------------------------------------------------------------------------------------------
注释:(1)按提示输入被积函数f(x),f(x)由基本初等函数构成,具体输入如下:
1.三角函数:sin(x);cos(x);tan(x);
2.反三角函数:arcsin(x);arccos(x);arctan(x);
3.双曲三角函数:hsin(x);hcos(x);htan(x);
4.对数函数:logn(n,x)其中n表示底数,如logn(10,5)表示以10为底对5求对数;
5.指数函数:aexp(a,x)其中a表示底数,如aexp(3,11)表示3的11次方;
6.其他函数:绝对值abs(x);开方sqr(x);e的次x幂exp(x);自然底数对数log(x);
7.运算符号:加(+);减(-);乘(*);除(/);幂(^);
8.注意以上函数中的括号不能省略,比如exp(-(x^2))中的括号就不能省略;
9.PI表示圆周率;EN表示自然底数。
(2)输入积分上下限(可以输入计算式),PI表示圆周率,EN表示自然底数,-w表示负无穷,+w表示正无穷;
(3)输入有效数位(1到12间的任意一个整数);
(4)计算广义积分时,建议先将有效数位调低一些,如果结果是无穷大,就不必计算了,如果是有限数字,提高有效数位再次计算;
(5)代码内添加了防止“死循环”的代码,所以不会出现死循环,如果某次计算耗时太长(一般不会出现这种情况,两三秒内就能搞定),想中断计算,按Ctrl+Alt+del呼出任务管理器,结束wscript.exe进程即可。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果能求的原函数的话用Newton-Leibnitz 公式来求.
如果原函数没有解析表达式的话,只能计算它的近似值.有多种方法,有等步长内插求值(Newton-Cotes,simpson,cotes等),外推Romberg法,自适应积分法,Gauss型等.
以简单simpson为例子.对[a,b]区间函数f(x)积分.它的步长为h=(b-a)/2;由Lagrange插值得到其的系数. 那么f(x)在[a,b]区间的积分函数的逼近形式为(b-a)/6*[f(a) + 4*f((a+b)/2) + f(b)];误差不是很大. 可以以f(x) = sin(x)在[0,PI] 算算误差在0.1左右.
如果原函数没有解析表达式的话,只能计算它的近似值.有多种方法,有等步长内插求值(Newton-Cotes,simpson,cotes等),外推Romberg法,自适应积分法,Gauss型等.
以简单simpson为例子.对[a,b]区间函数f(x)积分.它的步长为h=(b-a)/2;由Lagrange插值得到其的系数. 那么f(x)在[a,b]区间的积分函数的逼近形式为(b-a)/6*[f(a) + 4*f((a+b)/2) + f(b)];误差不是很大. 可以以f(x) = sin(x)在[0,PI] 算算误差在0.1左右.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
问问社区中的积分值是您在社区中等级划分的唯一依据,只要您的积分超过某一等级的上限,您就会升级,同时问问社区还会赠送你一定数量的积分。积分减少,等级不变,但是您要继续努力,将减少的积分再次积累起来,才能继续向上升级。只要您一直活跃在问问社区中,那么积分就会不断地升高。另外,积分还可以用来兑换奖品甚至Q币哦。
问题被采纳
回答的和提问的都+10分,回答问题+2分
问题被采纳
回答的和提问的都+10分,回答问题+2分
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询