#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))