При решении трансцендентного уравнения с помощью z=fsolve('Navig_model', z0) появляется сообщение Unable to parse command history line: d>
31.05.2020
function [z]= Navig_model (C,xM,yM,tB,z0)
z=size(z0);
x0=zeros(1,1);
F=[z(1)-z(2).*tan(z(3)+pi+asin(C/z(4)))-...
xM+yM.*tan(z(3)+pi+asin(C/z(4)))-...
z(4).*(tB+(z(1)- x0)./(z(4).*sin(z(3)))).*...
(cos(z(3)).*tan(z(3)+pi+asin(C/z(4)))-sin(z(3)))];
Ответы
Файл из которого вызываете ф-цию тоже можно?
%script-feil моделирования трассы объекта
clear;clc;
rg=180/pi;
%----------Подготовка исходных данных -----------
nM=4;
dM=1500;
for i=1:nM;
if ceil ((nM-1)/2)>=i;
%--- Координаты датчиков--
xM(i)=(i-1)*dM;
else xM(i)=(i-ceil ((nM-1)/2))*dM-dM/2; end;
if ceil ((nM-1)/2)>=i;
yM(i)=3000;
else yM(i)=3000-dM; end;
end;
%--- Координаты и ПД объекта ---
xO0=1000; yO0=0;
AK_grad=30; AK=AK_grad/rg;
V=8;
C=6;
gamma=asin(C/V); gamma_grad=gamma*rg;
disp([gamma_grad]);
for i=1:nM;
dM_B(i)=(xM(i)-yM(i)*tan(AK)-xO0+yO0*tan(AK))/sqrt(1+tan(AK)^2);
sgn(i)=sign(dM_B(i)); % Знак борта
if sgn(i)==-1; A_gamma(i)=AK+pi+gamma; A_P(i)=A_gamma(i)+pi/2;
else A_gamma(i)=AK+pi-gamma; A_P(i)=A_gamma(i)-pi/2; end;
A_gamma_grad(i)=A_gamma(i)*rg;
A_P_grad(i)=A_P(i)*rg;
xB(i)=((xO0-yO0*tan(AK))*tan(A_P(i))-(xM(i)-yM(i)*tan(A_P(i)))*tan(AK))/...
(tan(A_P(i))-tan(AK));
yB(i)=yO0+(xB(i)-xO0)/tan(AK);
tau(i)=(xB(i)+yB(i)*(tan(AK)-tan(A_gamma(i))-xM(i)))/...
(V*(sin(AK)+cos(AK)*tan(A_gamma(i)))-yM(i)*tan(A_gamma(i)));
xP(i)=xB(i)+V*tau(i)*sin(AK);
yP(i)=yB(i)+V*tau(i)*cos(AK);
VV(i)=C*cos(A_P(i))*(tan(A_gamma(i))-tan(A_P(i)))...
/(cos(AK)*tan(A_gamma(i))-sin(AK));
T0B(i)=(xB(i)-xO0)/(V*sin(AK));
Tau_BM(i)=(xB(i)-xM(i))/(C*sin(A_P(i)));
tB(i)=(xP(i)-xO0)/(V*sin(AK));
end;
z01=xM; z02=yM; z03=ones(1,1)*AK; z04=10*ones(1,1);
a1=size(z01);
a2=size(z02);
a3=size(z03);
a4=size(z04);
disp([a1 a2 a3 a4]);
z0=[z01 z02 z03 z04];
disp([z0]);
z=fsolve('Navig_model', z0);
По порядку, а то так сходу тяжело сразу суть уловить в не знакомой сфере:
результат этого - матрица размером [1x2]. Но в вашей функции при этом и.м.б. z(3), z(4) . . .
Спасибо за внимание!
Читаю у Вас:
"z=size(z0);
результат этого - матрица размером [1x2]".
Почему? Ведь в скрипт-файле
z0=[z01 z02 z03 z04];
То есть размер должен быть [1x10].
Нет, это содержимое z у вас равно z = [1, 10], а размер этого самого z будет 1х2. Одна строка, два столбца. И поэтому в переменной z нет элементов с номерами 3, 4 и т.д.
Возражение:
Я ввел в скрипт оператор
disp(['Содержимое z0']);
disp([z0]); ,
Вот его результат размерности вектора 1×10:
Содержимое z0
1.0e+03 *
0 1.5000 0.7500 2.2500 3.0000 3.0000 1.5000 1.5000 0.0005 0.0100
В теле функции введен оператор
z=size(z0);
Отсюда следует директивное задание размерности вектора z как 1×10.
Что я неправильно понимаю?
Содержимое z0
1.0e+03 *
0 1.5000 0.7500 2.2500 3.0000 3.0000 1.5000 1.5000 0.0005 0.0100
Размер содержимого z0: 1 строка, 10 столбцов.
Функция z=size(z0); возвращает вам размер содержимого в z0. Оно возвращает массив [1, 10] - два числа.
Т.е.
z = [1,10]
z(1) = 1
z(2) = 10
Размер массива z (не z0, а z) - 1x2.
В то время как далее у вас подразумевается что-то большее чем два. Может я не верно понял конечно, но вроде как-то так.
F=[z(1)-z(2).*tan(z(3)+pi+asin(C/z(4)))-...
xM+yM.*tan(z(3)+pi+asin(C/z(4)))-...
z(4).*(tB+(z(1)- x0)./(z(4).*sin(z(3)))).*...
(cos(z(3)).*tan(z(3)+pi+asin(C/z(4)))-sin(z(3)))];
PS: Что значит "директивное задание размерности" ?
PSPS: Чему вы подразумеваете у вас должно быть равно z? Точнее, что вы хотите чтоб в нем было?
Спасибо!
Я понял, в чем моя проблема: MATLAB предлагает для решения системы трансцендентных уравнений функцию
fsolve(F,x0).
Здесь х0 – вектор!
В моей задаче компоненты этого вектора ‒ тоже векторы, т.е. х0 – матрица.
Могу ли я обратиться к функции так:
fsolve(F,x01,x02,х03,х04), где х0i ‒ векторы разных размерностей?
Думаю, нет, но точно не знаю. А можно наверно х0i объединить в один вектор. Или это у вас решения на разных отрезках?