Как я могу остановить решатель matlab pde в наборе инструментов pde, когда решение нестабильно

Я решаю два связанных уравнения PDE, зависящих от времени, с помощью панели инструментов pde. Размер окна моделирования x = 6 и y = 10. В настоящее время я решаю его правильно и получаю доступ к данным решения, используя results =solve(model,tlist); u = results.NodalSolution(:,1,:);

Что мне нужно сделать, так это остановить код, когда решение u нестабильно по оси y. Это означает, что я хочу отслеживать решение u по оси y во время выполнения кода и останавливать его, когда оно соответствует критериям, которые я хочу. (Например, я хочу остановить код, когда решение u по y равно 0). Как я могу это сделать с помощью панели инструментов pde?

Вот что я пробовал до сих пор. Есть ли простой способ получить доступ к результатам во время выполнения кода? То есть я хочу получить доступ к решению для каждого временного шага.

 %calculate solutions
  n=4000;
  tlist = linspace(0,200,n);
  partial=zeros(49,1);

  for i=1:n
       results = solvepde(model,tlist(i:i+1));
       u = results.NodalSolution(:,1,1);
       v=results.NodalSolution(:,2,1);
       u1=results.NodalSolution(113:161,1,1);
       u2=results.NodalSolution(1,1,1);
       u3=results.NodalSolution(4,1,1);
      for j=1:49
          partial(j)=u1(j)-0.5*u2-0.5*u3;
      end
      sigma=sum(partial);
      if sigma>1e-4
          disp('verified')
          return
      end
  end

person Man    schedule 10.01.2018    source источник


Ответы (1)


Есть несколько способов остановить выполнение кода:

  • keyboard

Использование этой функции останавливает выполнение и дает вам доступ к клавиатуре, чтобы вы могли видеть все значения.

  • warning('Solution is unstable')

На самом деле это не остановит код, но выдаст вам предупреждение о том, что решение нестабильно.

  • error('Solution is unstable')

Это фактически остановит код, выдав вам ошибку, что решение нестабильно.

  • break

Это не даст вам никакой обратной связи, но остановит цикл for, а затем продолжит остальную часть кода.

Во всех случаях вы включаете способ остановки кода в операторе if, например

if (all(u==0))
    *statement from above*
end
person Nicky Mattsson    schedule 10.01.2018
comment
Спасибо за ваш ответ. Прямо сейчас код имеет возможность останавливаться. Но код очень медленный, поскольку он вычисляет те же результаты, что и вы, как вы можете видеть (tlist(i:i+1). Итак, мне нужно знать, есть ли способ получить доступ к результатам во время выполнения функции pdesolve. Если есть Таким образом, я могу удалить все функции for. В настоящее время results.NodalSolution дает доступ к результатам после того, как pdesolve вычислит все решение. То есть я могу увидеть результат только после того, как он достигнет 200 с. - person Man; 10.01.2018