You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:50:25