请问一下我这个for循环哪儿有错

这个是完整的代码,是为了实现龙伯透镜的射线追踪分析

tspan=[0 1.6];
no_lines=10;
a=1;
y0=range(-a,a,no_lines);
x0=sqrt.(1 .-y0.^2);
x1=ones(1,length(x0))*2*a;hold();
x1=ones(1,length(x0))*2*a;
y1=y0;
line([x0';x1],[y0';y1'],color= :green); hold();
phi=range(0,2*pi,100);
x=a*cos.(phi);
y=a*sin.(phi);
plot(x',y',color= :red,lw=3);
for lp=1:length(x0)
    Y0=[x0(lp) y0(lp) -1 0];
     options=odeset("RelTol",1e-5,"AbsTol",[1e-6]);
     T,Y,=ode45(ham,tspan,Y0,options);
     plot(Y[:,1],Y[:,2],color= :blue);hold();
end
ERROR: MethodError: objects of type Vector{Float64} are not callable
Use square brackets [] for indexing an Array.
Stacktrace:
 [1] top-level scope
   @ .\REPL[82]:2

这是其中调用用到的ham函数

function dy=ham(t,y)
 dy=zeros(4,1);
 dy(1)=y(3);
 dy(2)=y(4);
 dy(3)=-y(1);
 dy(4)=-y(2);

就是不知道这个错误应该如何改才能正确

Use square brackets [] for indexing an Array.

就是不知道加在哪儿 :smiling_face_with_tear:,试了一下都不对

x0(lp) y0(lp)

1 个赞

加了还是不对 :smiling_face_with_tear:

julia> for lp=1:length(x0)
       Y0=[[x0(lp)] [y0(lp)] -1 0];
       options=odeset("RelTol",1e-5,"AbsTol",[1e-6]);
       T,Y,=ode45(ham,tspan,Y0,options);
       plot(Y[:,1],Y[:,2],color= :blue);hold();
       end
ERROR: MethodError: objects of type Vector{Float64} are not callable
Use square brackets [] for indexing an Array.
Stacktrace:
 [1] top-level scope
   @ .\REPL[82]:2

x0[lp] y0[lp]

1 个赞

谢谢谢谢,这个问题解决了,但是又出现了一个新问题,希望您可以再帮我看看

julia> for lp=1:length(x0)
       Y0=[x0[lp] y0[lp] -1 0];
       options=odeset("RelTol",1e-5,"AbsTol",[1e-6]);
       T,Y,=ode45(ham,tspan,Y0,options);
       plot(Y[:,1],Y[:,2],color= :blue);hold();
       end
ERROR: MethodError: no method matching odeset(::String, ::Float64, ::String, ::Vector{Float64})
Stacktrace:
 [1] top-level scope
   @ .\REPL[83]:3

这个程序原本是在matlab上实现的,现在需要用mworks复现,而mworks使用的是julia,所以就一堆问题 :smiling_face_with_tear:

抱歉,我之前没查阅手册,现在我查阅手册后知道了julia中这个函数的正确用法,这个问题已经没有了,谢谢您

以后可以先试试把你的代码用 ``` code ``` 包起来后面加 find out how to fix the error at which line 先问 Ask AI · JuliaHub 我试了这个括号问题它可以修复

好的好的,我去试一下,谢谢