решение нелинейных уравнений в Matlab

У меня есть домашний вопрос, на который я не могу ответить. Вот подсказка для вопроса:

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

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

 formula (8.3)

 formula (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. После четырех часов возни с этим я даже не понимаю, о чем вопрос, а ТА в настоящее время не отвечают на электронные письма. Я написал следующий код, чтобы попытаться поместить 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
Чтобы подробно рассказать о комментарии LutzLs: попробуйте 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