Как мне написать код функции Бесселя с 10 слагаемыми в swift? - PullRequest
0 голосов
/ 12 апреля 2020

Я надеюсь, что вы, ребята, можете проверить. когда я использую 5 в качестве x, он должен показывать мне -0.17749282815107623, но возвращает -0.2792375. Я не мог, где я делал ошибку.

var evenNumbers = [Int]()
for i in 2...10 {
    if i % 2 == 0 {
        evenNumbers.append(i)
    }
}
func power(val: Float, power: Int)->Float{
    var c:Float = 1
    for  i in 1...power {
        c *= val
    }
    return c
}
func bessel(x: Float)->Float{
    var j0:Float = 0
    var counter = 1
    var lastDetermVal:Float = 1
    for eNumber in evenNumbers {
        print(lastDetermVal)
        if counter == 1 {
            lastDetermVal *= power(val: Float(eNumber), power: 2)
            j0 += (power(val: x, power: eNumber))/lastDetermVal
              counter = -1
        }else if counter == -1{
              lastDetermVal *= power(val: Float(eNumber), power: 2)
              j0 -= (power(val: x, power: eNumber))/lastDetermVal
              counter = 1

        }

    }

    return 1-j0
}

bessel(x: 5)

Функция 1:

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Похоже, ваша ошибка в том, что вам не хватило четных чисел.

var evenNumbers = [Int]()
for i in 2...10 {
    if i % 2 == 0 {
        evenNumbers.append(i)
    }
}

После выполнения вышеприведенного запроса evenNumbers будет заполнено [2,4,6,8,10]. Но чтобы оценить 10 терминов, вам нужны четные числа до 18 или 20, в зависимости от того, считаете ли вы «1006 *» «термином». Следовательно, вы должны l oop до 18 или 20:

var evenNumbers = [Int]()
for i in 2...18 { // I think the 1 at the beginning should count as a "term"
    if i % 2 == 0 {
        evenNumbers.append(i)
    }
}

В качестве альтернативы, вы можете создать этот массив следующим образом:

let evenNumbers = (1..<10).map { $0 * 2 }

Это означает "для каждое число от 1 (включительно) до 10 (исключая), умножьте каждое на 2 ".

Теперь ваше решение даст вам ответ -0.1776034.


Вот мой ( довольно медленное) решение:

func productOfFirstNEvenNumbers(_ n: Int) -> Float {
    if n == 0 {
        return 1
    }
    let firstNEvenNumbers = (1...n).map { Float($0) * 2.0 }
    // ".reduce(1.0, *)" means "multiply everything"
    return firstNEvenNumbers.reduce(1.0, *)
}

func nthTerm(_ n: Int, x: Float) -> Float {
    let numerator = pow(x, Float(n) * 2)
    // yes, this does recalculate the product of even numbers every time...
    let product = productOfFirstNEvenNumbers(n)
    let denominator = product * product
    return numerator / (denominator) * pow(-1, Float(n))
}

func bessel10Terms(x: Float) -> Float {
    // for each number n in the range 0..<10, get the nth term, add them together
    (0..<10).map { nthTerm($0, x: x) }.reduce(0, +)
}

print(bessel10Terms(x: 5))
0 голосов
/ 12 апреля 2020

Ваш код немного не читается, однако я написал простое решение, поэтому попробуйте сравнить ваши промежуточные результаты:

var terms: [Float] = []
let x: Float = 5

for index in 0 ..< 10 {
    guard index > 0 else {
        terms.append(1)
        continue
    }

    // calculate only the multiplier for the previous term
    // - (minus) to change the sign
    // x * x to multiply nominator
    // (Float(index * 2) * Float(index * 2) to multiply denominator
    let termFactor = -(x * x) / (Float(index * 2) * Float(index * 2))
    terms.append(terms[index - 1] * termFactor)
}

print(terms)

// sum the terms
let result = terms.reduce(0, +)
print(result)

Одна из ошибок, которые я вижу, заключается в том, что вы на самом деле рассчитываете только 5 терминов, а не 10 (вы перебираете от 1 до 10, но только четные числа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...