Julia牛顿法函数报错:无匹配^(::Vector{Float64}, ::Int64)方法
修正Julia牛顿迭代代码并实现对数误差图
错误原因分析
- 向量与标量不匹配:你将
x初始化为向量[x_0],随后直接用这个向量调用f,但你的f(x) = x^2 -13是标量函数,仅接受单个数值输入,无法处理向量,因此触发MethodError。 - 导数计算逻辑错误:
fd被提前计算一次,但牛顿法要求每次迭代都基于当前的x值重新计算导数,而非仅计算初始值的导数。 - 数组索引越界:Julia数组索引从1开始,你的循环从
n=0启动,第一次访问x[n]时会引用x[0],导致索引错误。 - 终止条件逻辑混乱:你先判断迭代步长,但此时还未计算下一个迭代值,逻辑顺序颠倒。
修正后的牛顿迭代函数
function newton(f, x_0; maxiterations=10, tolerance=1e-14, epsilon=1e-7) x = [x_0] # 存储所有迭代值的向量,初始值为x₀ for n in 1:maxiterations current_x = x[end] # 获取当前迭代的标量x值 f_current = f(current_x) # 先判断当前点的函数残差是否满足收敛条件 if abs(f_current) < tolerance return x end # 用有限差分近似计算当前点的导数(标量) fd = (f(current_x + epsilon) - f_current) / epsilon # 计算下一个迭代值 next_x = current_x - f_current / fd # 判断迭代步长是否满足收敛条件 if abs(next_x - current_x) < tolerance push!(x, next_x) return x end # 将新迭代值加入向量 push!(x, next_x) end return x # 达到最大迭代次数后返回所有迭代值 end
测试函数
定义求√13的目标函数并调用迭代:
f(x) = x^2 - 13 iterations = newton(f, 3) println("迭代结果向量:", iterations) println("最终近似值:", iterations[end]) println("与真实值的误差:", abs(iterations[end] - sqrt(13)))
绘制对数误差图
使用Plots包绘制迭代误差的对数坐标图,先确保已安装该包:
using Plots # 目标函数的真实解 true_value = sqrt(13) # 计算每次迭代的绝对误差 errors = abs.(iterations .- true_value) # 绘制对数误差曲线 plot(0:length(errors)-1, errors, xlabel="迭代次数", ylabel="绝对误差", yscale=:log10, title="牛顿迭代对数误差图", marker=:circle, legend=false)
内容的提问来源于stack exchange,提问作者jakekap7
相关产品推荐
相关产品推荐

