Учитывая, что вы используете старую функцию, для которой в качестве функции требуется строка, первое решение ниже не будет работать. Это, однако, правильный способ сделать это. Изменение старой функции для использования дескрипторов функций вместо строк было бы моим предпочтительным решением. Тем не менее, вы также можете использовать альтернативное решение ниже, которое использует глобальные переменные. Это не рекомендуемый подход ( мы должны стремиться избегать глобальных значений ), но он решит ваши краткосрочные проблемы.
Правильный подход: используйте анонимную функцию
Выследует использовать анонимную функцию, которая может захватывать переменные, когда они определены:
inter = @(p)interpn (x1, x2, x3, x4, x5, A, p(1), p(2), p(3), p(4), p(5), "spline");
Теперь inter(p)
работает так же, как если бы inter
был объявлен как нормальная функция. Но значения x1
, x2
и т. Д., Как они были определены при определении inter
, будут храниться внутри inter
.
Как указано, функция, которую вы передаете inter
, должна бытьнаписано для принятия дескрипторов функций.
Плохое, быстрое решение: используйте глобальные переменные
Сначала создайте файл inter.m
со следующим содержимым:
function FUN = inter(p);
global x1 x2 x3 x4 x5 A
FUN = interpn (x1, x2, x3, x4, x5, A, p(1), p(2), p(3), p(4), p(5), "spline");
end
Далее,в вашей функции сценария, которая вызывает inter
, снова объявите глобальные переменные (в настоящее время MATLAB предупреждает, что вы должны объявить их как глобальные переменные, прежде чем присваивать им значение, в будущих версиях это потребуется):
global x1 x2 x3 x4 x5 A
x1 = ...
x2 = ...
% etc
inter([10 2 4 3 4])
% or:
fminuit('inter',...)