#matlab #simulink #equation #symbolic-math
#matlab #simulink #уравнение #символьная математика
Вопрос:
Мне нужно решить набор из трех уравнений, для которых есть два решения. Поскольку ‘syms’ не будет работать в блоке библиотеки Simulink, я создал функцию .m, которая решает уравнения. Однако, когда я пытаюсь вызвать эту функцию с помощью coder.extrinsic, я получаю сообщение об ошибке «Вызовы coder.extrinsic могут отображаться только на верхнем уровне.», Что, как я предполагаю, связано с тем, что вызов выполняется в цикле «if».
Я не могу переместить вызов на верхний уровень, поскольку я определяю переменные для уравнений только в ‘else’ части цикла. Этот цикл else также является частью другого цикла if. Я показал функцию .m ниже. Переменные OMX, OMY, CX, CY, Target(1) и Target (2) различаются в зависимости от пути, по которому проходит код.
Есть ли другой способ обойти это?
function [c] = Planner_Circles
% Create set of equations to define possible tangent circles between defined circle and target
syms xt yt rt;
eqn1 = (xt-OMX)^2 (yt-OMY)^2 == (rt-OMR)^2;
eqn2 = (xt-CX)^2 (yt-CY)^2 == (rt R)^2;
eqn3 = (xt-Target(1))^2 (yt-Target(2))^2 == rt^2;
sol = vpasolve([eqn1, eqn2, eqn3], [xt, yt, rt]);
xSol = sol.xt;
ySol = sol.yt;
rSol = sol.rt;
% This gives two solutions
rt=((rSol(1)));
xt=((xSol(1)));
yt=((ySol(1)));
rt2=((rSol(2)));
xt2=((xSol(2)));
yt2=((ySol(2)));
% Choose largest radius for minimal curvature
if rt<rt2;
rt=rt2;
xt=xt2;
yt=yt2;
Комментарии:
1. Где coder.extrinsic в вашем коде? Вы можете вызвать фактическую функцию в любом месте. Но вам нужно объявить функцию с помощью coder.extrinsic на верхнем уровне.
2. Изначально у меня был вызов в цикле «if», который вернул ошибку «Вызовы coder.extrinsic могут отображаться только на верхнем уровне», поэтому я переместил вызов в начало кода, но это вернуло ошибки «неопределенная функция или переменная» для всех моих символьных переменных.
3. Я бы перенес все связанные символьные функции и переменные во внешнюю функцию и объявил всю функцию внешней.