График Matlab (x, ans)?

#matlab

#matlab

Вопрос:

привет всем, у меня есть завершенный код, который выполняет все, что я хочу, я просто застрял на отображении моего вывода. У меня не так много опыта работы с функциями, и в настоящее время я застрял на том, как отображать мою информацию. Мой написанный код:

 function x = Tridiag(e,f,g,r) 
% Tridiag: Tridiagonal equation solver banded system 
%   x = Tridiag(e,f,g,r): Tridiagonal system solver. 
clc;clear;
% input: 
    D = 2;
    U =1;
    L = 0.2;
    c0 = 80;
    c10 = 10;
    dx = 1;
    n=9;
  e = ones(n,1)*(-2.5);
  f = ones(n,1)*(4.2);
  g = ones(n,1)*(-1.5);
   r = [200;0;0;0;0;0;0;0;0;15];
% output: 
%   x = solution vector  
% forward elimination 
for k = 2:n
    factor = e(k)/f(k-1);
    f(k) = f(k) - factor*g(k-1); 
    r(k) = r(k) - factor*r(k-1); 
end
% back substitution 
x(n) = r(n)/f(n); 
for k = n-1:-1:1 
    x(k) = (r(k)-g(k)*x(k 1))/f(k);
end
end
  

в настоящее время, когда вы запускаете функцию, она отображает выходные данные как ans = 68.641, 58.87 …. и так далее. Я хотел бы отобразить свою информацию следующим образом:

 x = 0.1:1:10
plot(x,ans)
  

Я столкнулся с проблемой перезаписи значения моей функции x = 0.1: 1: 10, и matlab не понимает «ans». Я пытался создать ans, используя переменную like c = Tridiag(e,f,g,r); plot (x,c) , но это не работает. Любая помощь была бы очень полезна

Комментарии:

1. Просто сохраните возвращаемое значение функции: outval = Tridiag(...); plot(x,outval); .

2. % back substitution x(n) = r(n)/f(n); for k = n-1:-1:1 x(k) = (r(k)-g(k)*x(k 1))/f(k); end outval = Tridiag(e,f,g,r); plot(x,outval) end Я получаю сообщение об ошибке: неопределенная функция ‘Tridiag’ для входных аргументов типа ‘double’.

3. Вам нужно вызвать функцию извне функции … либо из другой функции, либо из командной строки MATLAB. Где вы это писали plot …?

4. Я добавил график в конце функции, чтобы попытаться заставить его отображать информацию после завершения функции.

5. @jake это плохая практика программирования. Не создавайте график функции, заставляйте функцию вычислять значения и выводить график снаружи.

Ответ №1:

Есть несколько проблем и несколько разных решений:

  • Длина вашего вектора ans и x что бы они ни были, не одинаковы.
  • Вы передаете переменные в функцию, но не используете их (вы даже очищаете их в начале функции).

Я предполагаю, что x это должна быть длина ans , которая равна n=9 . Вы должны масштабировать по своему усмотрению.


Вы можете запускать все в скрипте, а не в функции.

 clc; clear;

D = 2;
U =1;
L = 0.2;
c0 = 80;
c10 = 10;
dx = 1;
n=9;
e = ones(n,1)*(-2.5);
f = ones(n,1)*(4.2);
g = ones(n,1)*(-1.5);
r = [200;0;0;0;0;0;0;0;0;15];
% output:
%   x = solution vector
% forward elimination
for k = 2:n
    factor = e(k)/f(k-1);
    f(k) = f(k) - factor*g(k-1);
    r(k) = r(k) - factor*r(k-1);
end
% back substitution
y(n) = r(n)/f(n);
for k = n-1:-1:1
    y(k) = (r(k)-g(k)*y(k 1))/f(k);
end

x = 1:1:n;
plot(x,y)
  

Или укажите функцию:

 function x = Tridiag(e,f,g,r,n)
% Tridiag: Tridiagonal equation solver banded system
%   x = Tridiag(e,f,g,r): Tridiagonal system solver.
% input:
D = 2;
U =1;
L = 0.2;
c0 = 80;
c10 = 10;
dx = 1;
% output:
%   x = solution vector
% forward elimination
for k = 2:n
    factor = e(k)/f(k-1);
    f(k) = f(k) - factor*g(k-1);
    r(k) = r(k) - factor*r(k-1);
end
% back substitution
x(n) = r(n)/f(n);
for k = n-1:-1:1
    x(k) = (r(k)-g(k)*x(k 1))/f(k);
end
end
  

и назовите это:

 n=9;
e = ones(n,1)*(-2.5);
f = ones(n,1)*(4.2);
g = ones(n,1)*(-1.5);
r = [200;0;0;0;0;0;0;0;0;15];
x = 1:1:n;
plot(x,Tridiag(e,f,g,r,n))