gpt4 book ai didi

c++ - 如何计算 Haskell 中的正弦函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:18:42 24 4
gpt4 key购买 nike

这是我的问题:我需要一个 Haskell 函数来计算 sine 的近似值一些数字,使用相关的泰勒级数......

在 C++ 中我这样写:

double msin(double number, int counter = 0, double sum = 0)
{
// sin(x) = x - (x'3 / 3!) + (x'5 / 5!) - (x'7 / 7!) + (x'9 / 9!)
if (counter <= 20)
{
if (counter % 2 == 0)
sum += mpow(number, counter * 2 + 1) / mfak(counter * 2 + 1) ;
else
sum -= mpow(number, counter * 2 + 1) / mfak(counter * 2 + 1) ;

counter++;
sum = msin(number, counter, sum);

return sum;
}

return (sum* 180.0 / _PI);
}

现在我正在尝试在 Haskell 中做这件事,但我不知道如何...现在我正在尝试这样的事情(它实际上没有用,但它正在进行中;)):

这个有效:

mfak number = if number < 2
then 1
else number *( mfak (number -1 ))


mpow number potenca = if potenca == 0
then 0
else if potenca == 1
then 1
else (number * (mpow number (potenca-1)))

这行不通:

msin :: Double -> Int -> Double -> Double                           
msin number counter sum = if counter <= 20
then if counter `mod` 2==0
then let sum = sum + (msin 1 (let counter = counter+1 in counter) sum) in sum
else let sum = sum + (msin 1 (let counter = counter+1 in counter) sum) in sum
else sum* 180.0 / 3.14

更新....不编译:/“无法匹配预期类型 Double' 与实际类型 Int'”

msin :: Double -> Int -> Double -> Double                           
msin number counter sum = if counter <= 20
then if counter `mod` 2==0
then let sum' = sum + ((mpow number (counter*2+1))/(mfak counter*2+1)) in msin number (counter+1) sum'
else let sum' = sum - ((mpow number (counter*2+1))/(mfak counter*2+1)) in msin number (counter+1) sum'
else sum* 180.0 / 3.14

如您所见,最大的问题是如何向“sum”添加一些内容,增加“counter”并使用这些新值再次递归......

P.S. 我是 Haskell 的新手,所以尽可能多地解释您的解决方案。我正在阅读一些教程之类的,但我找不到如何将某些表达式的结果保存到一个值中,然后在它之后继续其他代码......每次我尝试这样做时它都会返回我的值,并且我不想那样....

非常感谢您的帮助!

最佳答案

我会稍微修改一下算法。首先我们可以定义逆阶乘列表:

factorialInv :: [Double]
factorialInv = scanl (/) 1 [1..] -- 1/0! , 1/1! , 1/2! , 1/3! , ...

然后,我们使用正弦系数:

sineCoefficients :: [Double]
sineCoefficients = 0 : 1 : 0 : -1 : sineCoefficients

然后,给定 x,我们将上述两个列表逐点乘以 x 的幂:

powerSeries :: [Double]   -- ^ Coefficients
-> Double -- ^ Point x on which to compute the series
-> [Double] -- ^ Series terms
powerSeries cs x = zipWith3 (\a b c -> a * b * c) cs powers factorialInv
where powers = iterate (*x) 1 -- 1 , x , x^2 , x^3 , ...

最后,我们对前 20 个项求和。

sine :: Double -> Double                   
sine = sum . take 20 . powerSeries sineCoefficients
-- i.e., sine x = sum (take 20 (powerSeries sineCoefficients x))

关于c++ - 如何计算 Haskell 中的正弦函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26576296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com