Моя переменная определена, но Джулия говорит, что это не так?

#scope #julia

Вопрос:

Когда я запускаю это, он может использовать переменную m, чтобы дать мне таблицу значений, но затем, когда я прошу ее напечатать m, она говорит, что она не определена? Я думаю, это может быть связано с областью применения?

 # Solving x - 2^(-x) = 0 via the Trisection Method
# Its exactly like before, but now there are three sections.

# Define the main function, initial brackets [a,b],
# midpoint, and iteration variable.
function main(x)
    return (x - 2^(-x)) 
end

a = 0
b = 1
i = 0

# main loop
while((b - a) > 0.0001)
    m = (a   b) / 2
    r = (1/3)*(2*a   b)
    t = (1/3)*(a   2*b)
    i  = 1
    
    if(main(r) > 0)
        b = r
    elseif(main(t) > 0)
        a = r
        b = t
    else
        a = t
    end
    println(m)
end

# Output
println(m)
#print("after ")
#print(i)
#print(" iterations")
 

Комментарии:

1. Вы работаете в глобальном масштабе. Это плохо в Джулии и приведет к ошибкам (подобным тем, которые вы видите) и плохой производительности. Убедитесь, что весь вызываемый вами код находится внутри функций.

Ответ №1:

Как вы уже догадались, это действительно проблема с областью применения.

Вы впервые назначаете переменную m внутри while блока. while Блок имеет тип области действия «локальный (мягкий)», что означает, что когда m он еще не является локальной переменной (как в данном случае), в области назначения создается новая локальная m переменная-в вашем случае блок while. Поскольку m теперь он является локальным для блока while, его нельзя использовать вне этого блока while, поэтому возникает ошибка при попытке println(m) выйти за рамки блока while.

Дополнительную информацию смотрите на этой странице в документации Julia по областям действия переменных.

Если вы хотите использовать переменную m вне области действия блока while, то вы можете использовать global ключевое слово при назначении, т. Е.

 while((b - a) > 0.0001)
    global m = (a   b) / 2
    #other code
end

println(m)
 

Но, как упоминает @DNF, вам было бы лучше обернуть все в определения функций.