Вопрос:

Цикл не правильно оценивает в MATLAB

matlab loops

35 просмотра

1 ответ

13 Репутация автора

У меня проблема с тем, что цикл по какой-то причине работает неправильно, или, может быть, это не сам цикл, а то, на что я не обращал внимания. Я пытался решить проблему часами, но безрезультатно.

Вот код:

syms t;
syms m(t);
Nq=3;
L(1,1)=1;
L(2,1)=2;
L(3,1)=3;
w(1,1)=0.2;
w(2,1)=0.1;
w(3,1)=0.7;
G=1;



for x=1:1:2*Nq

    m0val(x)=w(1,1)*L(1,1).^(x-1) + w(2,1)*L(2,1).^(x-1) + w(3,1)*L(3,1 ).^(x-1);

end

ode=diff(m,t)==0;
cond = m(0)==m0val(1);
mf(1)=dsolve(ode,cond);

for x=2:1:2*Nq
    ode=diff(m,t)==(x-1)*G*mf(x-1);
    cond=m(0)==m0val(x);
    mf(x)=dsolve(ode,cond);

end


z=1;
for y=0.2:0.2:1
    for x=1:1:2*Nq
        mfv(z,x)=subs(mf(x),t,y);
    end

        for x=1:1:2*Nq+1
                P(x,1)=eq(x,1);
        end
     ****for x=1:1:2*Nq+1
            if x~=2*Nq+1
                P(x,2)=((-1).^(x-1))*mfv(z,x);
            else 
                P(x,2)=0;
            end****
     end

        for y=3:1:2*Nq+1
            for x=1:1:2*Nq+2-y
                P(x,y)=P(1,y-1)*P(x+1,y-2)-P(1,y-2)*P(x+1,y-1);
            end
        end
        alpha(1)=mfv(z,1);
        for x=2:1:2*Nq
            alpha(x)=P(1,x+1)/(P(1,x)*P(1,x-1));
        end
        a(1)=alpha(2);
        for x=2:1:Nq
            a(x)=alpha(2*x)+alpha(2*x-1);
        end
        for x=1:1:Nq-1
            b(x)=-(alpha(2*x+1)*alpha(2*x)).^0.5;
        end
        for x=1:1:Nq
            Jacobi(x,x)=a(x);
        end
        for x=1:1:Nq-1
            Jacobi (x+1,x)=b(x);
            Jacobi(x,x+1)=b(x);
        end
        [evec,eval]=eig(Jacobi);


                for x=1:1:Nq
                L(x,z+1)=eval(x,x);
                w(x,z+1)=mfv(z,1)*evec(1,x).^2;
                end


   z=z+1;
end

Бит между * находится там, где он не работает должным образом, потому что, если я вычисляю, скажем P(2,2), он должен быть равен (-1)^(1)*mfv(z,2)(где z=1для первого запуска). Это дает значение 1, которое является значением P(1,2).

Автор: user8833722 Источник Размещён: 08.11.2017 11:40

Ответы (1)


1 плюс

409 Репутация автора

Решение

Я запускаю ваш код и нахожу проблему с Pтипом данных. Pв вашем коде есть логика, поэтому он не может хранить двойные или около того значения.

Я объявляю, Pпрежде чем использовать его в цикле, тогда код работает нормально.

z=1;

P = zeros(2,2);% the add line

for y=0.2:0.2:1
    for x=1:1:2*Nq
        mfv(z,x)=subs(mf(x),t,y);
    end

    for x=1:1:2*Nq+1
        P(x,1)=eq(x,1);
    end
    for x=1:1:2*Nq+1
        if x~=2*Nq+1
            P(x,2)=((-1).^(x-1))*mfv(z,x);
        else
            P(x,2)=0;
        end
    end
Автор: Mohammad nagdawi Размещён: 09.11.2017 02:33
Вопросы из категории :
32x32