用vb编程计算: x-x^3/3!+x^5/5-x^7/7!+…
答案:2 悬赏:10 手机版
解决时间 2021-11-29 11:00
- 提问者网友:寂寞撕碎了回忆
- 2021-11-28 17:28
用vb编程计算: x-x^3/3!+x^5/5-x^7/7!+…
最佳答案
- 五星知识达人网友:孤独的牧羊人
- 2021-11-28 18:29
这是sinx的泰勒展开式吧:
Private Sub Command1_Click()
Dim x As Double, k As Long, p As Long, n As Long, y1 As Double, y2 As Double, sum As Double
x = InputBox("请输入x值:", "输入", 1)
k = 1: p = 1: y1 = x: y2 = x: sum = x
Do
p = -p
y1 = y1 * x * x / (k + 1) / (k + 2)
sum = sum + y1 * p
k = k + 2
If Abs(Abs(y1) - Abs(y2)) < 0.0000000001 Then Exit Do
y2 = y1
n = n + 1
Loop Until n >= 1000
Print sum
End Sub追问可不可以给我讲一下嘛,拜托、追答这个让我怎么讲?从哪个角度,数学上的,算法上的,还是代码上的?追问算法上的,就是“y1 = y1 * x * x / (k + 1) / (k + 2) "
还有这个“ y1 = x: y2 = x: sum = x”是什么意思?追答sinx的泰勒展开式x-x^3/3!+x^5/5!-x^7/7!+…
x → (+1)×x^1÷1! ①
-x^3/3! → (-1)×x^3÷3! ②
+x^5/5! → (+1)×x^5÷5! ③
-x^7/7! → (-1)×x^7÷7! ④
2=1+1,3=1+2 3=1+2
4=3+1,5=3+2 5=3+2
6=5+1,7=5+2
②=①×x^2÷2÷3×(-1)
③=②×x^2÷4÷5×(-1)
④=③×x^2÷6÷7×(-1)
“k = 1: p = 1: y1 = x: y2 = x: sum = x”,只是用于初始化,跳过①的计算。
当你看到②怎么由①计算,③怎么由②计算,④怎么由③计算时,就可以看到这是一个迭代过程,即An+1=An×x^2÷(2×n)÷(2×n+1)×(-1)。而且(2×n)、(2×n+1)本身也可以进行迭代,即k = k + 2。
这样你应该就能理解“y1 = y1 * x * x / (k + 1) / (k + 2)”了吧。
我为什么要迭代呢?主要是减少计算量,加快计算速度。
Private Sub Command1_Click()
Dim x As Double, i As Long, n As Long, y As Double, y1 As Double, y2 As Double, sum As Double
Dim t As Double
x = InputBox("请输入x值:", "输入", 1)
't = Now: Print t
'传统
n = 3: y1 = x: y2 = x: sum = x
Do
y = 1
For i = 1 To n
y = y * i
Next i
y1 = x ^ n / y * IIf(n Mod 4 = 1, 1, -1)
sum = sum + y1
If Abs(y1 - y2) < 0.0000000001 Then Exit Do
y2 = y1
n = n + 2
Loop Until n >= 1000
Print sum
'Print "用时:" & CStr((CDbl(Now) - t) * 24 * 3600) & "秒"
't = Now: Print t
'迭代
n = 2: y1 = x: y2 = x: sum = x
Do
y1 = -y1 * x * x / n / (n + 1)
sum = sum + y1
If Abs(y1 - y2) < 0.0000000001 Then Exit Do
y2 = y1
n = n + 2
Loop Until n >= 1000
Print sum
'Print "用时:" & CStr((CDbl(Now) - t) * 24 * 3600) & "秒"
End Sub
如果不用误差来控制跳出Do循环而用n来控制跳出Do循环,你会发现n=171时传统法就Double类型溢出了...
Private Sub Command1_Click()
Dim x As Double, k As Long, p As Long, n As Long, y1 As Double, y2 As Double, sum As Double
x = InputBox("请输入x值:", "输入", 1)
k = 1: p = 1: y1 = x: y2 = x: sum = x
Do
p = -p
y1 = y1 * x * x / (k + 1) / (k + 2)
sum = sum + y1 * p
k = k + 2
If Abs(Abs(y1) - Abs(y2)) < 0.0000000001 Then Exit Do
y2 = y1
n = n + 1
Loop Until n >= 1000
Print sum
End Sub追问可不可以给我讲一下嘛,拜托、追答这个让我怎么讲?从哪个角度,数学上的,算法上的,还是代码上的?追问算法上的,就是“y1 = y1 * x * x / (k + 1) / (k + 2) "
还有这个“ y1 = x: y2 = x: sum = x”是什么意思?追答sinx的泰勒展开式x-x^3/3!+x^5/5!-x^7/7!+…
x → (+1)×x^1÷1! ①
-x^3/3! → (-1)×x^3÷3! ②
+x^5/5! → (+1)×x^5÷5! ③
-x^7/7! → (-1)×x^7÷7! ④
2=1+1,3=1+2 3=1+2
4=3+1,5=3+2 5=3+2
6=5+1,7=5+2
②=①×x^2÷2÷3×(-1)
③=②×x^2÷4÷5×(-1)
④=③×x^2÷6÷7×(-1)
“k = 1: p = 1: y1 = x: y2 = x: sum = x”,只是用于初始化,跳过①的计算。
当你看到②怎么由①计算,③怎么由②计算,④怎么由③计算时,就可以看到这是一个迭代过程,即An+1=An×x^2÷(2×n)÷(2×n+1)×(-1)。而且(2×n)、(2×n+1)本身也可以进行迭代,即k = k + 2。
这样你应该就能理解“y1 = y1 * x * x / (k + 1) / (k + 2)”了吧。
我为什么要迭代呢?主要是减少计算量,加快计算速度。
Private Sub Command1_Click()
Dim x As Double, i As Long, n As Long, y As Double, y1 As Double, y2 As Double, sum As Double
Dim t As Double
x = InputBox("请输入x值:", "输入", 1)
't = Now: Print t
'传统
n = 3: y1 = x: y2 = x: sum = x
Do
y = 1
For i = 1 To n
y = y * i
Next i
y1 = x ^ n / y * IIf(n Mod 4 = 1, 1, -1)
sum = sum + y1
If Abs(y1 - y2) < 0.0000000001 Then Exit Do
y2 = y1
n = n + 2
Loop Until n >= 1000
Print sum
'Print "用时:" & CStr((CDbl(Now) - t) * 24 * 3600) & "秒"
't = Now: Print t
'迭代
n = 2: y1 = x: y2 = x: sum = x
Do
y1 = -y1 * x * x / n / (n + 1)
sum = sum + y1
If Abs(y1 - y2) < 0.0000000001 Then Exit Do
y2 = y1
n = n + 2
Loop Until n >= 1000
Print sum
'Print "用时:" & CStr((CDbl(Now) - t) * 24 * 3600) & "秒"
End Sub
如果不用误差来控制跳出Do循环而用n来控制跳出Do循环,你会发现n=171时传统法就Double类型溢出了...
全部回答
- 1楼网友:低音帝王
- 2021-11-28 19:06
你的题化简是:X-X+X-X…追问才不是呢,你看清楚嘛。追答看哈源码追问我不懂嘛。
----
----
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯