【问题标题】:error loops, Gaussian elimination julia错误循环,高斯消除 julia
【发布时间】:2016-09-01 19:48:46
【问题描述】:

下面的代码使用高斯方法求解线性系统。当我再次运行时,出现错误:

LoadError: InexactError()
while loading In[176], in expression starting on line 4

 in setindex! at array.jl:313
 [inlined code] from In[176]:13
 in anonymous at no file:12

运行3次以上系统解决。怎么了?

A = [4.1 -5 6.8;7.8 -8 -9;-17 4 1];
b = [1,2,3];
x = zeros(3);
m = 0;

al,ac = size(A)

for k= 1:(al-1)
    #println("valor de k ",k)
    for i = (k+1):al
        #println("valor de i ",i)
        m = A[i,k]/(A[k,k])
        A[i,k] = 0
        for j=(k+1):al
            #println("valor de j",j)
            A[i,j] = A[i,j] - m*A[k,j]
            b[i]= b[i] - m*b[k]
        end
    end
end
x[al] = b[al]/(A[al,al])
for k = (al-1):-1:1
    begin
        s = 0;
        for j = (k+1):al
            s = s+A[k,j]*x[j]
        end
        x[k]=(b[k]-s)/A[k,k]
    end
end
println(x)

【问题讨论】:

  • 我猜输出不正确,b的类型应该是Array{Float64},改用b = Float64[1,2,3];
  • 嗨格尼穆克。一切都好。我以浮点格式(1.0、2.0、3.0)输入数字,它起作用了;)。感谢您的提示
  • 您需要将代码放入函数中;它的风格要好得多(明确显示输入和输出是什么,并且易于重用),并且会在 julia 中获得更好的性能。
  • 嗨贝扎森。我用函数的形式写的,效果更好;)

标签: system linear-algebra julia gaussian


【解决方案1】:

这个错误主要是由于变量和值的类型不匹配,考虑这个简单的例子,

julia> convert(Int64, 0.1)
ERROR: InexactError()

InexactError() 被抛出,因为它无法将 0.1 表示为整数。

julia>convert(Int64, 1.0)
1

如您所见,值 1.0 在转换为 Int64 时没有问题。所以在你的情况下,因为数组b 的类型是Array{Int64,1},它肯定不能在适当的过程中保存浮点变量,因此会出现错误。

考虑到@jeff 的输入,最好将代码打包到一个函数中,

julia>function f(A::Array{Float64,2}, b::Vector{Float64})
          x = zeros(3);
          m = 0.0;
          al,ac = size(A)
          for k= 1:(al-1)
              #println("valor de k ",k)
              for i = (k+1):al
                  #println("valor de i ",i)
                  m = A[i,k]/(A[k,k])
                  A[i,k] = 0
                  for j=(k+1):al
                      #println("valor de j",j)
                      A[i,j] = A[i,j] - m*A[k,j]
                      b[i]= b[i] - m*b[k]
                  end
              end
          end
          x[al] = b[al]/(A[al,al])
          for k = (al-1):-1:1
              begin
              s = 0;
              for j = (k+1):al
                  s = s+A[k,j]*x[j]
              end
              x[k]=(b[k]-s)/A[k,k]
          end
      end
      return x, A, b
  end
f (generic function with 1 method)

julia> A = [4.1 -5 6.8;7.8 -8 -9;-17 4 1];
julia> b = [1,2,3.0];

这应该导致矩阵A 转换为上三角形式,

julia> A
3×3 Array{Float64,2}:
4.1  -5.0        6.8
0.0   1.5122   -21.9366
0.0   0.0     -213.523

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多