Как исправить «неопределенную функцию или переменную» в Matlab? - PullRequest
1 голос
/ 29 сентября 2019

Я определил группу констант.Я хочу использовать их в локальных функциях.Функция не может получить доступ к этим значениям, и я получаю сообщение об ошибке. Неопределенная функция или переменная 'g'.

Я попытался изменить положение функций. Также попытался сделать константы глобальными, чтобы каждая локальная функция знала их

**% Define constants** 
  K=0.5; % minor loss coefficient (square edged)
  g=9.8; % gravity in m/s2


**%call function**
f1= 2 (value obtained from external function)  
 v1=velocity1(f1);

**% define function**
 function v1=velocity1(f)
 v1= sqrt((2*g*h)/(1+(f*(L./D))+K));
 end

>> LvsQ_plot
Undefined function or variable 'g'.

Error in LvsQ_plot>velocity1 (line 48)
v1= sqrt((2*g*h)/(1+(f*(L./D))+K));

Error in LvsQ_plot (line 31)
v1=velocity1(f1);

1 Ответ

2 голосов
/ 29 сентября 2019

Существует несколько подходов, передающих константы в функции MATLAB

Определение переменных как global - простое решение.
Использование global делает переменную "видимой" для всех функций и сценариев.Недостатком использования global является то, что он не расширяемый и предотвращает повторное использование кода.
С точки зрения академической разработки программного обеспечения вам вообще не следует использовать глобальные переменные.Предполагая, что ваш код используется для решения конкретной проблемы и не будет расширяться или использоваться повторно, использование global разрешено.

Использование global:
Объявить константы как глобальные перед инициализацией:

global K g
K=0.5; % minor loss coefficient (square edged)
g=9.8; % gravity in m/s2

Объявить переменные как глобальные в любой функции, которая их использует:

function v1=velocity1(f)
    global K g
    v1= sqrt((2*g*h)/(1+(f*(L./D))+K));
end

Использование вложенных функций:
Вместо использования global вы можете использовать подход «вложенные функции» - внутренняя функция может обращаться к переменным внешней функции.
Определить ваш основной скрипт как функциюи velocity1 как внутренняя функция:

function main()
%main is the outer function, and velocity1 is an inner function

K=0.5; % minor loss coefficient (square edged)
g=9.8; % gravity in m/s2
h=1;L=3;D=4;

f1= 2; %(value obtained from external function)  
v1=velocity1(f1);

    %Inner function:
    function v1=velocity1(f)
        v1= sqrt((2*g*h)/(1+(f*(L./D))+K));
    end
end

Передача структуры параметров в функцию:
Общее решение - MATLAB передает структуру с постоянными параметрами всем функциям, которыеиспользует их:

param.K=0.5; % minor loss coefficient (square edged)
param.g=9.8; % gravity in m/s2
param.h=1;param.L=3;param.D=4;

f1= 2; %(value obtained from external function)  
v1=velocity1(f1, param);

function v1=velocity1(f, par)
    K = par.K;
    g = par.g;
    h=par.h;L=par.L;D=par.D;
    v1= sqrt((2*g*h)/(1+(f*(L./D))+K));
end

Существуют и другие подходы, но я не могу перечислить их все ...

...