• Регистрация
FighterPilot
FighterPilot 0.00
н/д

Пустые графики

04.04.2021

Добрый день!
В лабораторной работе возникла проблема - матлаб рисует пустые графики. В работе проводится исследование статических режимов динамической системы. Часть кода далее (остальное - построение для u2, практически не отличается):

clc, clear;
global Phin w Uc rv in rya ce cm wn Mv p eps;
Phin = 0.005;
w = 8600;
Uc = 220;
rv = 415; 
in = 30; 
rya = 1.39;
ce = 300; cm = 300;
wn = 100;
Mv = 50;
p = [1.5876 0 -1.7208 0 1.4780 0];
eps = 0.001;

u1 = 1.2:-0.2:0.2; 
u = [u1; ones(size(u1))];

x0 = [1; 1; 1]; xx = [];
for i = 1:1:length(u1)
    x = newton('F_fun', 'G_fun', x0, u(:,i), eps);
    xx = [xx x];
    x0 = x;
end
x1 = xx(1,:);
x2 = xx(2,:);
x3 = xx(3,:);

figure(1);
subplot (221);
plot(u1, x1), grid on, title ('Зависимость магнитного потока от Uв');
subplot (222);
plot(u1, x2), grid on, title ('Зависимость тока якоря от Uв');
subplot (223);
plot(u1, x3), grid on, title ('Зависимость угловой скорости от Uв');
subplot (224);
plot(u1, x1,'k', u1, x2, 'k --', u1, x3, 'k *'), grid on;
title ('Статические характеристики при U1=var, U2=const');
legend('X1(u1)', 'X2(u1)', 'X3(u1)');

При выполнении дает предупреждения:

Warning: Matrix is singular to working precision. 
> In newton (line 5)
In lab2 (line 20)
 
Warning: Matrix is singular, close to singular or badly scaled. Results may be inaccurate. RCOND = NaN. 
> In newton (line 5)
In lab2 (line 20)

Насколько я понял, число, которое получается при выполнении функции newton слишком маленькое и не может отобразиться. Из-за этого матрицы x у меня записаны как вектор NaN. Сама функция Ньютона:

function [res]=newton(F,G,x0,u,eps)
    arr=feval(F,x0,u); res=x0;
    while(norm(arr)> eps)
        f_G=feval(G,res,u);
        res=res-(f_G)\arr;
        arr=feval(F,res,u);
    end
end

Как итог, программа выводит пустые графики, с сеткой, с подписями, но без самих графиков.

Подскажите пожалуйста, что я делаю не так?

Теги

    04.04.2021

    Ответы

    • aBoomest
      aBoomest+942.89
      4.04.2021 16:10

      1. F_fun, G_fun - ???
      2. Пустые, т.к. там NaNами забито скорее всено. о чем и ошибка. А вот почему - сложно сказать. См.п.№1.

      • FighterPilot
        FighterPilot0.00
        4.04.2021 16:39

        Извиняюсь, забыл прикрепить функции

        F_fun:

        function z = F_fun(x,u)
        global rya ce cm Phin wn in Mv p5 Uc
        z = [u(1)-polyval(p5, x(1)); ...
            -Uc+ce*Phin*wn*x(1)*x(3)+rya*in*x(2); ...
            cm*Phin*in*x(1)*x(2)-(2*cm*Phin*in-Mv)*u(2)];
        end

        G_fun:

        function z = G_fun(x,u)
        global rya ce cm Phin wn in p5
        p = polyder (p5);
        z = [polyval(p,x(1)) 0 0; ...
            ce*Phin*wn*x(3) rya*in ce*Phin*wn*x(1);...
            cm*Phin*in*x(2) cm*Phin*in*x(1) 0];
        end
        • aBoomest
          aBoomest+942.89
          4.04.2021 17:41

          Все верно. Переменная f_G содержит нули. Обратная матрица нихт существует. (наверно не матемкоректно выразился, ну да ладно)

          function [res]=newton(F,G,x0,u,eps)
              arr=feval(F,x0,u); res=x0;
              while(norm(arr)> 10)
                  f_G=feval(G,res,u);
          
                  f_G(1) = 1;
          
                  res=res-(f_G)\arr;
                  arr=feval(F,res,u);
              end
          end

          Чисто для тупой проверки исключил это выделенной строчкой. Заработало. Но другой вопрос что у вас явно расходится процесс, а не сходится к значению eps, поэтому не спешите запускать скрипт.  У вас значения в матрице большие, след-но норма тоже. А eps - минус треться степень.