Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Эксперт по математике/физике
 Аватар для jogano
6360 / 4067 / 1512
Регистрация: 09.10.2009
Сообщений: 7,550
Записей в блоге: 4

Построение графика многочлена по равноотстоящим узлам

24.06.2017, 19:18. Показов 1085. Ответов 2

Студворк — интернет-сервис помощи студентам
Уважаемые знатоки Матлаба, пишу функцию для построения плавной кривой по данным равноотстоящим узлам xi, i=1;n так, как это строится в Экселе в меню Вставка>Точечная диаграмма>С гладкими кривыми и маркерами.
Формулы я вывел, код Матбала написал, он работает "уныло через циклы" (© Зосима) правильно. Но хочется сделать красиво по-матлабному, как рекомендовалось в FAQ-ах. Но в приведённых примерах было всего 2-3 узловые точки, по которым строился график кусочной функции (и столько же слагаемых вида (x<1).*f1(x)+(x>=1 & x<=2).*f2(x)+(x>2).*f3(x) ), а у меня узлов может быть много, в зависимости от того, какой вектор ввести в качестве аргумента функции.
Вот код:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function GlataKurboLauxX(X)
% функция отрисовывает плавную кривую в системе координат (T;X) как в Экселе по данным n точкам xi
% в равноотстоящих узлах i=1:n (шаг 1). Свойства этой кривой: в каждом узле i f(i)=xi и в каждом узле, кроме крайних
% i=1 и i=n, касательная к кривой в узле параллельна линии, соединяющей два соседних узла, то есть 
% f'(i)=(x_(i+1)-x_{i-1})/2
n=length(X);
T=1:0.05/n:n; % промежуток между двумя соседними узлами разбивается на 20 участков
i=floor(T); % индекс ближайшего левого узла для текущего значения T
% для T є[1;2] одна формула, для T є[n-1;n] другая, для средних промежутков - третья
F=(T<=2).*(X(1)+(-X(3)+4*X(2)-3*X(1))/2.*(T-1)+(X(3)-2*X(2)+X(1))/2.*(T-1).^2)+...
    (T>=n-1).*(X(n)+(3*X(n)-4*X(n-1)+X(n-2))/2.*(T-n)+(X(n)-2*X(n-1)+X(n-2))/2.*(T-n).^2)+...
   +(T>2 & T<n-1).*(X(i)+(X(i+1)-X(i-1))/2.*(T-i)+(-X(i+2)+4*X(i+1)-5*X(i)+2*X(i-1))/2.*(T-i).^2+(X(i+2)-3*X(i+1)+3*X(i)-X(i-1))/2.*(T-i).^3);
plot(T,F,'Color','Red','LineWidth',2)
hold 'all'
grid 'on'
for i=1:n-1 % отдельно отрисовка самих узлов
   line([i i+1],[X(i) X(i+1)],'MarkerFaceColor',[0 1 1],'MarkerEdgeColor',[0 0 0],'Marker','o','LineStyle','none'); 
end;
Вот что выдаётся при вызове:
Matlab M
1
2
3
4
5
6
7
>> GlataKurboLauxX([3 7 5 8 3 4 2])
??? Index exceeds matrix dimensions.
 
Error in ==> GlataKurboLauxX at 10
F=(T<=2).*(X(1)+(-X(3)+4*X(2)-3*X(1))/2.*(T-1)+(X(3)-2*X(2)+X(1))/2.*(T-1).^2)+...
 
>>
Превышения индекса массива не вижу. Может, переменная i=floor(T) не воспринимается как индекс массива. В чём может быть проблема?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2017, 19:18
Ответы с готовыми решениями:

Решение многочлена и построение графика
Помогите выполнить 2 первых задания в маткаде, пожалуйста

Построение графика интерполяционного многочлена Лагранжа (Delphi)
Здравствуйте. Требуется ваша помощь в редактировании кода программы. Я реализую программу, которая строила бы два графика разного цета...

Delphi. Построение формулы многочлена Лагранжа
Помогите исправить ошибку в кнопке &quot;Вывести формулу&quot;. код для Unit2 взяла из другой программы, а вот сообразить как подправить не...

2
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
24.06.2017, 20:18
Уберите ; из оператора стр.8, и Вы увидите что последний элемент массива i=7.
Из-за этого X(i+1) X(i+2) - за границами массива
1
Эксперт по математике/физике
 Аватар для jogano
6360 / 4067 / 1512
Регистрация: 09.10.2009
Сообщений: 7,550
Записей в блоге: 4
24.06.2017, 21:00  [ТС]
SSC, да, при T=7 i=7. Выходит, если даже условие в строке 12 (T>2 & T<n-1) не выполняется, то Матлаб всё равно пытается вычислить вторую скобку (X(i)+(X(i+1)-X(i-1))/2.*(T-i)+... ), и если не получается, выдаёт ошибку?
И красиво не выйдет в такой ситуации?
Тогда придётся делать уныло:
Кликните здесь для просмотра всего текста
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function GlataKurboLauxX_1(X)
% функция отрисовывает плавную кривую в системе координат (T;X) как в Экселе по данным n точкам xi
% в равноотстоящих узлах i=1:n (шаг 1). Свойства этой кривой: в каждом узле i f(i)=xi и в каждом узле, кроме крайних
% i=1 и i=n, касательная к кривой в узле параллельна линии, соединяющей два соседних узла, то есть 
% f'(i)=(x_(i+1)-x_{i-1})/2
n=length(X);
% для T є[1;2] одна формула, для T є[n-1;n] другая, для средних промежутков - третья
T=1:0.05:2;
F=X(1)+(-X(3)+4*X(2)-3*X(1))/2.*(T-1)+(X(3)-2*X(2)+X(1))/2.*(T-1).^2;
plot(T,F,'Color','Red','LineWidth',2)
hold 'all'
grid 'on'
for i=2:n-2
    T=i:0.05:i+1;
    F=X(i)+(X(i+1)-X(i-1))/2.*(T-i)+(-X(i+2)+4*X(i+1)-5*X(i)+2*X(i-1))/2.*(T-i).^2+(X(i+2)-3*X(i+1)+3*X(i)-X(i-1))/2.*(T-i).^3;
    plot(T,F,'Color','Red','LineWidth',2)
end;
T=n-1:0.05:n;
F=X(n)+(3*X(n)-4*X(n-1)+X(n-2))/2.*(T-n)+(X(n)-2*X(n-1)+X(n-2))/2.*(T-n).^2;
plot(T,F,'Color','Red','LineWidth',2)
for i=1:n-1 % отдельно отрисовка самих узлов
   line([i i+1],[X(i) X(i+1)],'MarkerFaceColor',[0 1 1],'MarkerEdgeColor',[0 0 0],'Marker','o','LineStyle','none'); 
end;

Хотя и правильно:
Миниатюры
Построение графика многочлена по равноотстоящим узлам  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2017, 21:00
Помогаю со студенческими работами здесь

Построение аппроксимирующего многочлена. Ошибка в коде
Есть код - &quot;работающий&quot;. При компиляции на выходе должна быть матрица в зависимости от числа n, которое задается, а точки загружаются из...

Построение многочлена Жегалкина по данной СДНФ
надо построить многочлен жегалкина по данной СДНФ a=_x3*_x2*x1*_x0+_x3*_x2*x1*x0+_x3*x2*_x1*x0+x3*_x2*_x1*_x0+x3*_x2*_x1*x0 _...

Построение интерполяционного многочлена в форме Ньютона
Здравствуйте, подскажите в чем проблема. Пишу задачу в MathCAD, наработки прикреплю ниже. Одна из функций отказывается работать. В чем...

Построение графика производной для каждого графика из 3 режимов
Дорогие друзья, прошу помочь доделать три программы. В каждой программе выводится по одному графику и нужно чтобы каждая программа выводила...

Проверка графика многочлена на корректность
Здравствуйте, я написал программу которая рисует график многочлена не выше 5-ой степени, но никак не могу проверить корректно ли программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru