这是一段可以对任意一个一元函数进行数值积分的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进程即可。
1、计算公式:
F=P*(1+i)^n
F=A((1+i)^n-1)/i
P=F/(1+i)^n
P=A((1+i)^n-1)/(i(1+i)^n)
A=Fi/((1+i)^n-1)
A=P(i(1+i)^n)/((1+i)^n-1)
F:终值(Future Value),或叫未来值,即期末本利和的价值。
P:现值(Present Value),或叫期初金额。
A:年金(Annuity),或叫等额值。
i:利率或折现率
N:计息期数
复利计算的特点是:把上期末的本利和作为下一期的本金,在计算时每一期本金的数额是不同的。复利的本息计算公式是:F=P(1+i)^n
复利计算有间断复利和连续复利之分。按期(如按年、半年、季、月或日等)计算复利的方法为间断复利;按瞬时计算复利的方法为连续复利。在实际应用中一般采用间断复利的计算方法。
复利现值
复利现值是指在计算复利的情况下,要达到未来某一特定的资金金额,必须投入的本金。所谓复利也称利上加利,是指一笔存款或者投资获得回报之后,再连本带利进行新一轮投资的方法。
复利终值
复利终值是指本金在约定的期限内获得利息后,将利息加入本金再计利息,逐期滚算到约定期末的本金之和。
2、例题
例如:本金为50000元,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的本金+利息收入,按复利计算公式来计算就是:50000×(1+3%)^30
由于,通胀率和利率密切关联,就像是一个硬币的正反两面,所以,复利终值的计算公式也可以用以计算某一特定资金在不同年份的实际价值。只需将公式中的利率换成通胀率即可。
例如:30年之后要筹措到300万元的养老金,假定平均的年回报率是3%,那么,必须投入的本金是3000000×1/(1+3%)^30
每年都结算一次利息(以单利率方式结算),然后把本金和利息和起来作为下一年的本金。下一年结算利息时就用这个数字作为本金。复利率比单利率得到的利息要多。
扩展资料:
复利计算应用:
(1)计算多次等额投资的本利终值
当每个计息期开始时都等额投资P,在n个计息期结束时的终值为:Vc= P(1+i)×[(1+i)^n-1]/i。
显然,当n=1时,Vc= P×(1+i),即在第一个计息期结束时,终值仅包括了一次的等额投资款及其利息,当n=2时,Vc= P×(2+3×i+i×i),即在第二个计息期结束时,终值包括了第一次的等额投资款及其复利和第二次的等额投资款及其单利。
在建设工程中,投标人需多次贷款或利用自有资金投资,假定每次所投金额相同且间隔时间相同,工程验收后才能得到工程款M,如若Vc>M,则投标人不宜投标。
(2)计算多次等额回款值
假定每次所回收的金额相同且间隔时间相同,则计算公式为:Vc/n= P×(1+i)^n×i/[(1+i)^n-1]。
显然,当n=1时,V= P×(1+i),即在第一个计息期结束时,就全部回收投资。在建设工程中,投标人一次投资P后,假定招标人每隔一段时间就等额偿还中标人工程款项M,如若Vc/n>M,则投标人不宜投标。