решаване на нелинейни уравнения в matlab

Имам въпрос за домашна работа, на който не мога да отговоря. Ето подканата за въпрос:

  1. Дефинирайте ур. 8.3 и уравнение 8.4 във функция. Тази функция трябва да вземе вектор от ъгли на ставите (\alphaи \beta) като вход и трябва да върне вектор на колона, съдържащ двете функции (f_{1} и f_{2}), оценени под тези ъгли. Функцията трябва да съдържа дължините на връзките и стойностите на R{des}и H_{des} = 1.1 за изчисление. Включете вашия код във вашето решение.

Уравнения 8.3 и 8.4 са:

формула (8.3)

формула (8.4)

където

d_{1}  = d_{2} = 1.0

R{des} = 1

H_{des} = 1.1

\alpha = \left \langle 0, \frac{\pi}{2} \right \rangle

\beta = \left \langle 0, \pi \right \rangle

Ето функцията, която написах:

function F = rob_arm (alphag, betag)
F = (1).*cos(alphag)+ (1).*(cos(alphag+betag))-(1) ;
  (1).*sin(alphag) + (1).*(sin(alphag+betag))-(1.1) ;
end

Тъй като alpha и beta са матрици с различни размери, използвах meshgrid, за да създам alphag и betag, и използвах тези матрици, за да изчисля стойностите на rob_arm. След четири часа бъркане с това, дори вече не съм сигурен какво задава въпросът, а TA в момента не отговарят на имейли. Написах следния код, за да опитам да принудя rob_arm в една колона:

alpha = 0:pi/100:(pi/2); %define angle alpha
beta = 0:pi/100:pi; %define angle beta

[alphag, betag] = meshgrid (alpha, beta); %mesh grid alpha and beta b/c different matrix dimensions
arm_pos = rob_arm (alphag, betag);

for ii = 1:1:101
    for k = 1:1:51
 col_vec (1,1:1:5151) = arm_pos(ii,k);
    end
end

Пренебрегвайки заявката за създаване на колонен вектор, полученият изход arm_pos е добър изход. Мога да го начертая на графика и получавам много красива картина на всички възможни точки, които тази ръка на робота може да „достигне“.

Но тъй като съм тъп и опитвам това от много часове, той не записва последователни стойности на rob_arm в col_vec, а просто го замества всеки път и в крайна сметка получавам матрица 1x1. В крайна сметка целта ще бъде да се използва методът на Нютон-Рафсън за определяне на нулите на тази функция, но това е много далеч. Мисля си, че ако мога да събера всички стойности, изчислени от rob_arm в една колона, тогава мога да отговоря на този въпрос.

Следващият въпрос е:

  1. Създайте отделна функция, която приема въвеждане на един ред вектор, съдържащ двойката ъгли \alphaи < img src="https://chart.googleapis.com/chart?cht=tx&chl=%5Cbeta" alt="\beta">. Резултатът от функцията трябва да бъде Якобиан (матрица 2 на 2). Първо, изчислете производните на уравнения. 8.3 – 8.4 на ръка, след което ги поставете във вашата функция. Включете своя функционален код във вашето решение

За което ще трябва да помоля за пояснение, защото не разбирам как матрица 1 x 51 (alpha) и матрица 1 x 102 (beta) могат да бъдат приети в един ред вектор, който след това ще изведе матрица 2x2 . Знам какво е Якобиан и това са частичните производни на моите две функции, а не матрица от стойности.

Ако някой иска да ми помогне, това би било супер страхотно.


person Macon Leighton    schedule 30.03.2015    source източник
comment
Това не е ли толкова лесно за коригиране, колкото връщането на стойността на функцията като вектор, F = [ f1; f2 ] със съответните изрази за f1 и f2?   -  person Lutz Lehmann    schedule 30.03.2015
comment
За да разясните коментара на LutzL: опитайте function F = rob_arm (alphag, betag) F = [(1).*cos(alphag)+ (1).*(cos(alphag+betag))-(1) ; ... (1).*sin(alphag) + (1).*(sin(alphag+betag))-(1.1)]; end   -  person Buck Thorn    schedule 30.03.2015
comment
Използвайте набор от три точки ... ако продължавате израз между редовете в MATLAB (в Octave не винаги е необходимо да имате точките ...)   -  person Buck Thorn    schedule 30.03.2015


Отговори (1)


Вашата дефиниция на функцията не е правилна, трябва да използвате нещо подобно

function F = rob_arm (alphag, betag) 
 F = [(1).*cos(alphag)+ (1).*(cos(alphag+betag))-(1) ; ...   
      (1).*sin(alphag) + (1).*(sin(alphag+betag))-(1.1)]; 
end

Без трите точки " ... " MATLAB извършва това изчисление

 (1).*sin(alphag) + (1).*(sin(alphag+betag))-(1.1);

но не прави нищо с резултата и се връща

  F = (1).*cos(alphag)+ (1).*(cos(alphag+betag))-(1) ; 

което не е това, което искате, половината F стойности липсват.

person Buck Thorn    schedule 30.03.2015