为什么不进入for循环

# code
function zldata()
    Data = readdlm( "D:\\Julia\\IEEE4.txt" )
    n=Data[1,1]
    zls=Data[1,2]
    zero=findall(iszero,Data[:,1])
    czl=Data[zero[1,1]+1:zero[2,1]-1,:]#纯支路之间,序号,i,j ,r,x,b/2
    duididaona=Data[zero[2,1]+1:zero[3,1]-1,:]#对地节点数,导纳
    T=Data[zero[3,1]+1:zero[4,1]-1,:]#变压器支路,序号,i,j ,r,x,k,k下,k上
    PQ=Data[zero[4,1]+1:zero[5,1]-1,:]#所有节点序号,PG,QG,PL,QL,节点类型
    PV=Data[zero[5,1]+1:zero[6,1]-1,:]#PV和平衡节点的节点号,U,θ,Q下,Q上
    V=PV[:,2]
    pq=0
    pv=0
    ph=0
    bh=PQ[:,6]
    e=Array[float,n,1]
    f=Array[float,n,1]
    for c=1:n
        if bh[c]==1
            pq+=1
        elseif bh[c]==2
            pv+=1
        else
            ph=c#平衡节点的位置
        end
    end
    phv=size(PV,1)#读取PV阵的行数,ph节点放PV的最后一行
    e=rand(Float32, n, 1)
    f=rand(Float32, n, 1)
    for a=1:n
        if bh[a]==1
            e(a)=1
            f(a)=0
           P(a)=PQ(a,2)-PQ(a,4)
           Q(a)=PQ(a,3)-PQ(a,5)
    elseif bh[a]==2
           e(a)=V(a-pq)
           f(a)=0
           P(a)=PQ(a,2)-PQ(a,4)
        else
           e(a)=V(phv)*cos(PV(phv,3))
           f(a)=V(phv)*sin(PV(phv,3))
        end
    end
end 
#问题
不进入for循环,也不出结果,请问这是什么原因

你数组索引写错了,是nums[index],不是nums(index)
不进入for的话,可能是你的1:n中的n是负数,无法生成这个范围

  1. 你的i数组有一部分是错的,
  2. 看有没有进入循环可以通过加 println(),也许你的 n 是负数
  3. 我其实只是闲得想试一下 代码的 diff 功能,发现不能和 高亮一起用,有diff 就没有代码高亮。
function zldata()
    Data = readdlm( "D:\\Julia\\IEEE4.txt" )
    n=Data[1,1]
    zls=Data[1,2]
    zero=findall(iszero,Data[:,1])
    czl=Data[zero[1,1]+1:zero[2,1]-1,:]#纯支路之间,序号,i,j ,r,x,b/2
    duididaona=Data[zero[2,1]+1:zero[3,1]-1,:]#对地节点数,导纳
    T=Data[zero[3,1]+1:zero[4,1]-1,:]#变压器支路,序号,i,j ,r,x,k,k下,k上
    PQ=Data[zero[4,1]+1:zero[5,1]-1,:]#所有节点序号,PG,QG,PL,QL,节点类型
    PV=Data[zero[5,1]+1:zero[6,1]-1,:]#PV和平衡节点的节点号,U,θ,Q下,Q上
    V=PV[:,2]
    pq=0
    pv=0
    ph=0
    bh=PQ[:,6]
    e=Array[float,n,1]
    f=Array[float,n,1]
    for c=1:n
+      println("进入循环1")
        if bh[c]==1
            pq+=1
        elseif bh[c]==2
            pv+=1
        else
            ph=c#平衡节点的位置
        end
    end
    phv=size(PV,1)#读取PV阵的行数,ph节点放PV的最后一行
    e=rand(Float32, n, 1)
    f=rand(Float32, n, 1)
    for a=1:n
+      println("进入循环2")
        if bh[a]==1
-            e(a)=1
-            f(a)=0
-           P(a)=PQ(a,2)-PQ(a,4)
-           Q(a)=PQ(a,3)-PQ(a,5)
+            e[a]=1
+            f[a]=0
+           P[a]=PQ[a,2]-PQ[a,4]
+           Q[a]=PQ[a,3]-PQ[a,5]
    elseif bh[a]==2
-           e(a)=V(a-pq)
-           f(a)=0
-           P(a)=PQ(a,2)-PQ(a,4)
+           e[a]=V[a-pq]
+           f[a]=0
+           P[a]=PQ[a,2]-PQ[a,4]
        else
-           e(a)=V(phv)*cos(PV(phv,3))
-           f(a)=V(phv)*sin(PV(phv,3))
+           e[a]=V[phv]*cos(PV[phv,3])
+           f(a)=V[phv]*sin(PV[phv,3])
        end
    end
end 
    之前没有使用包,所以n没有赋值上去
但现在点运行还是没有出结果
程序如下
"'Julia
 #code
using DelimitedFiles
function zldata()
Data = readdlm( "D:\\Julia\\IEEE4.txt" )
n=Data[1,1]
zls=Data[1,2]
zero=findall(iszero,Data[:,1])
czl=Data[zero[1,1]+1:zero[2,1]-1,:]#纯支路之间,序号,i,j ,r,x,b/2
duididaona=Data[zero[2,1]+1:zero[3,1]-1,:]#对地节点数,导纳
T=Data[zero[3,1]+1:zero[4,1]-1,:]#变压器支路,序号,i,j ,r,x,k,k下,k上
PQ=Data[zero[4,1]+1:zero[5,1]-1,:]#所有节点序号,PG,QG,PL,QL,节点类型
PV=Data[zero[5,1]+1:zero[6,1]-1,:]#PV和平衡节点的节点号,U,θ,Q下,Q上
V=PV[:,2]
pq=0
pv=0
ph=0
bh=PQ[:,6]
e=Array[float,n,1]
f=Array[float,n,1]
for c=1:n
println("进入循环1")
if bh[c]==1
    pq+=1
elseif bh[c]==2
    pv+=1
else
    ph=c#平衡节点的位置
end
end
phv=size[PV,1]#读取PV阵的行数,ph节点放PV的最后一行
e=rand(Float32,n, 1)
f=rand(Float32, n, 1)
for a=1:n
println("进入循环2")
if bh[a]==1
    e[a]=1
    f[a]=0
    P[a]=PQ[a,2]-PQ[a,4]
    Q[a]=PQ[a,3]-PQ[a,5]
elseif bh[a]==2
    e[a]=V[a-pq]
    f[a]=0
    P[a]=PQ[a,2]-PQ[a,4]
else
    e[a]=V[phv]*cos(PV[phv,3])
    f[a]=V[phv]*sin(PV[phv,3])
end
end
end

#IEEE4数据
4 4 1 18 0.1
1.00E-05 2
1 4
0
1 1 2 0.1 0.4 0.01528
2 1 4 0.12 0.5 0.0192
3 2 4 0.08 0.4 0.01413
0
2 0
0
1 1 3 0 0.3 0.90909 0.9 1.15
0
1 0 0 0.3 0.18 1
2 0 0 0.55 0.13 1
3 0.5 0 0 0 2
4 0.36 0.26 0 0 0
0
3 1.1 0 -0.1 0.6
4 1.05 0 -0.6 0.6
0
3 44.4 351 50 0.3 1.2
4 40.6 389 50 0.3 1.2
0
0
#工作区没有结果,这是为什么呢

工作区没有结果

?? 不懂,能详细点吗

你好歹吧报错贴出来啊,算了,我闲的无聊,我帮你贴

ERROR: LoadError: MethodError: Cannot `convert` an object of type 
  typeof(float) to an object of type 
  Array
Closest candidates are:
  convert(::Type{T}, ::AbstractArray) where T<:Array at array.jl:533
  convert(::Type{T}, ::T) where T<:AbstractArray at abstractarray.jl:14
  convert(::Type{T}, ::LinearAlgebra.Factorization) where T<:AbstractArray at /build/julia/src/julia-1.4.2/usr/share/julia/stdlib/v1.4/LinearAlgebra/src/factorization.jl:55
  ...
Stacktrace:
 [1] setindex!(::Array{Array,1}, ::Function, ::Int64) at ./array.jl:826
 [2] getindex at ./array.jl:397 [inlined]
 [3] zldata() at /home/sukanka/Documents/Scripts/Julia/others/main.jl:17
 [4] top-level scope at /home/sukanka/Documents/Scripts/Julia/others/main.jl:50
 [5] top-level scope at REPL[7]:1
in expression starting at /home/sukanka/Documents/Scripts/Julia/others/main.jl:50`

根据报错,如果我没有会错意的话,应该这样改

using DelimitedFiles
function zldata()
    Data = readdlm(raw"IEEE4.txt")
    n = Data[1,1]
    zls = Data[1,2]
    zero = findall(iszero, Data[:,1])
    czl = Data[zero[1,1] + 1:zero[2,1] - 1,:]# 纯支路之间,序号,i,j ,r,x,b/2
    duididaona = Data[zero[2,1] + 1:zero[3,1] - 1,:]# 对地节点数,导纳
    T = Data[zero[3,1] + 1:zero[4,1] - 1,:]# 变压器支路,序号,i,j ,r,x,k,k下,k上
    PQ = Data[zero[4,1] + 1:zero[5,1] - 1,:]# 所有节点序号,PG,QG,PL,QL,节点类型
    PV = Data[zero[5,1] + 1:zero[6,1] - 1,:]# PV和平衡节点的节点号,U,θ,Q下,Q上
    V = PV[:,2]
    pq = 0
    pv = 0
    ph = 0
    bh = PQ[:,6]
-    e = Array[float,n,1]
-    f = Array[float,n,1]
+    e = ones(Float64, n)
+    f = ones(Float64, n)
    for c = 1:n
        println("进入循环1")
        if bh[c] == 1
            pq += 1
        elseif bh[c] == 2
            pv += 1
        else
            ph = c# 平衡节点的位置
        end
    end
-    phv = size[PV,1]# 读取PV阵的行数,ph节点放PV的最后一行
-    phv = size(PV,1)# 读取PV阵的行数,ph节点放PV的最后一行
    e = rand(Float32, n, 1)
    f = rand(Float32, n, 1)
+   P = rand(n)
+   Q = rand(n)
    for a = 1:n
        println("进入循环2")
        if bh[a] == 1
            e[a] = 1
            f[a] = 0
            P[a] = PQ[a,2] - PQ[a,4]
            Q[a] = PQ[a,3] - PQ[a,5]
        elseif bh[a] == 2
            e[a] = V[a - pq]
            f[a] = 0
            P[a] = PQ[a,2] - PQ[a,4]
        else
            e[a] = V[phv] * cos(PV[phv,3])
            f[a] = V[phv] * sin(PV[phv,3])
        end
    end
+   return e, f, P, Q
end

然后其实还会出错,因为 PQ 都没有定义过(我给你加上了,现在不会报错了),返回值我也给你加上了。
从这里基本上可以看出,你连基本的语法都没有搞懂(不知道什么时候用 (),什么时候用 []),建议先通读 Julia 1.5 中文文档

最后建议使用 VSCode

1 个赞


点运行之后就是这样的:Workpace里ans是nothing,这是没法运行的意思?还是什么意思?

不是,你没有指定函数返回值时,函数会把最后那行的数据当作结果返回
同样的,如果在函数最后是一个没有指定返回值的函数时,返回这个函数的返回值

function foo()
    # code
    10
end

foo() == 10 # true

函数如果指定返回nothing,那么就会返回nothing,此时ans == nothing