Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
3 / 2 / 1
Регистрация: 18.03.2020
Сообщений: 64

Требуется провести оптимальный путь по вершинам на поверхности, оптимальным считается путь с наименьшим перепадом высот

30.04.2020, 18:31. Показов 1018. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как выглядит задание:
Разрабатывается настольная игра для детей, в которую входит макет поверхности планеты.
Макет имеет форму прямоугольной пластины, нижняя сторона которой плоская, а верхняя представляет собой поверхность, заданную уравнением
z = f( x y) = Z=10*sin(0.9*Y-0.4*X)*sin(1.1*X)*sin(0.2*Y)+15.
«Рельеф планеты» холмистый. В «низинах» или на «вершинах холмов» (в зависимости от варианта) расположены точечные датчики, с помощью которых жители планеты следят за сейсмической активностью планеты.
Часть 1. Постройте трехмерное изображение макета. Постройте линии уровня поверхности.
Найдите численно или аналитически координаты всех датчиков и пометьте места их расположения как на трехмерном изображении, так и на рисунке с линиями уровня.
Часть 2. Проложите по поверхности планеты дорогу, соединяющую места расположения датчиков. Сделайте это таким образом, чтобы движение от одного датчика к другому происходило в плоскости, параллельной оси Oz. Дорогу задайте аналитически (параметрическими уравнениями) и нанесите ее изображение на трехмерную поверхность. Вычислите длину дороги. Найдите координаты самой «крутой» (см. методическую поддержку) точки
дороги и нанесите эту точку на трехмерное изображение и рисунок с линиями уровня (как предупреждение о трудном участке дороги).
Часть 3. По правилам игры для некоторых жителей важно, чтобы дороги, проложенные по их планете, имели как можно меньший перепад высот (см. методическую поддержку). Проложите между датчиками дополнительную дорогу (можно в форме ломаной), постаравшись как можно лучше учесть интересы таких жителей. Дополнительную дорогу задайте аналитически (параметрическими уравнениями) и нанесите ее изображение на трехмерную поверхность. Вычислите для нее перепад высот. Для сравнения вычислите перепад высот вдоль дороги, построенной при выполнении Части 2
Что я сделал:
Первые 2 пункта
Как выглядит код:
Кликните здесь для просмотра всего текста
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
clear; clc; clf;
figure(1)
hold on; grid on;
[X Y] = meshgrid(0:0.01:8, 0:0.01:15);
Z=10*sin(0.9*Y-0.4*X).*sin(1.1*X).*sin(0.2*Y)+15;
meshz(X, Y, Z)
figure(2)
hold on; grid on;
[C, h]=contour(X, Y, Z, 100);
% clabel(C,h);
%-----------------------------------------------------------------------------------------------------------
x01=[4.54 1.175];
s1=[4.23 0.85];
t1=[4.85 1.5];
[X1,fm1]=fmincon(@(X)(-(10*sin(0.9*X(2)-0.4*X(1)).*sin(1.1*X(1)).*sin(0.2*X(2))+15)),x01,[],[],[],[],s1,t1);
Zmax1=-fm1
XY1=X1
figure(2)
plot(X1(1),X1(2),'*b')
text(X1(1)+0.1,X1(2)+0.1, 'A')
figure(1)
plot3(X1(1),X1(2), Zmax1,'*b','linewidth', 10)
text(X1(1),X1(2), Zmax1+1, 'A', 'fontsize', 50)
%-----------------------------------------------------------------------------------------------------------
x02=[1.5 2.8];
s2=[1.39 2.62];
t2=[1.66 3.05];
[X2,fm2]=fmincon(@(X)(-(10*sin(0.9*X(2)-0.4*X(1)).*sin(1.1*X(1)).*sin(0.2*X(2))+15)),x02,[],[],[],[],s2,t2);
Zmax2=-fm2
XY2=X2
figure(2)
plot(X2(1),X2(2),'*b')
text(X2(1)+0.1,X2(2)+0.1, 'B')
figure(1)
plot3(X2(1),X2(2), Zmax2,'*b','linewidth', 10)
text(X2(1),X2(2), Zmax2+1, 'B', 'fontsize', 50)
%-----------------------------------------------------------------------------------------------------------
x03=[7.185 5.105];
s3=[7.09 4.97];
t3=[7.28 5.24];
[X3,fm3]=fmincon(@(X)(-(10*sin(0.9*X(2)-0.4*X(1)).*sin(1.1*X(1)).*sin(0.2*X(2))+15)),x03,[],[],[],[],s3,t3);
Zmax3=-fm3
XY3=X3
figure(2)
plot(X3(1),X3(2),'*b')
text(X3(1)+0.1,X3(2)+0.1, 'C')
figure(1)
plot3(X3(1),X3(2), Zmax3,'*b','linewidth', 10)
text(X3(1),X3(2), Zmax3+1, 'C', 'fontsize', 50)
%------------------------------------------------------------------------------------------------------------
x04=[4.285 7.165];
s4=[4.13 6.96];
t4=[4.44 7.37];
[X4,fm4]=fmincon(@(X)(-(10*sin(0.9*X(2)-0.4*X(1)).*sin(1.1*X(1)).*sin(0.2*X(2))+15)),x04,[],[],[],[],s4,t4);
Zmax4=-fm4
XY4=X4
figure(2)
plot(X4(1),X4(2),'*b')
text(X4(1)+0.1,X4(2)+0.1, 'D')
figure(1)
plot3(X4(1),X4(2), Zmax4,'*b','linewidth', 10)
text(X4(1),X4(2), Zmax4+1, 'D', 'fontsize', 50)
%------------------------------------------------------------------------------------------------------------
x05=[1.41 9.29];
s5=[1.33 9.17];
t5=[1.49 9.41];
[X5,fm5]=fmincon(@(X)(-(10*sin(0.9*X(2)-0.4*X(1)).*sin(1.1*X(1)).*sin(0.2*X(2))+15)),x05,[],[],[],[],s5,t5);
Zmax5=-fm5
XY5=X5
figure(2)
plot(X5(1),X5(2),'*b')
text(X5(1)+0.1,X5(2)+0.1, 'E')
figure(1)
plot3(X5(1),X5(2), Zmax5,'*b','linewidth', 10)
text(X5(1),X5(2), Zmax5+1, 'E', 'fontsize', 50)
%------------------------------------------------------------------------------------------------------------
x06=[7.06 11.66];
s6=[6.93 11.45];
t6=[7.19 11.87];
[X6,fm6]=fmincon(@(X)(-(10*sin(0.9*X(2)-0.4*X(1)).*sin(1.1*X(1)).*sin(0.2*X(2))+15)),x06,[],[],[],[],s6,t6);
Zmax6=-fm6
XY6=X6
figure(2)
plot(X6(1),X6(2),'*b')
text(X6(1)+0.1,X6(2)+0.1, 'F')
figure(1)
plot3(X6(1),X6(2), Zmax6,'*b','linewidth', 10)
text(X6(1),X6(2), Zmax6+1, 'F', 'fontsize', 50)
%-------------------------------------------------------------------------------------------------------------
x07=[8.115 13.56];
s7=[3.96 13.37];
t7=[4.27 13.75];
[X7,fm7]=fmincon(@(X)(-(10*sin(0.9*X(2)-0.4*X(1)).*sin(1.1*X(1)).*sin(0.2*X(2))+15)),x07,[],[],[],[],s7,t7);
Zmax7=-fm7
XY7=X7
figure(2)
plot(X7(1),X7(2),'*b')
text(X7(1)+0.1,X7(2)+0.1, 'G')
figure(1)
plot3(X7(1),X7(2), Zmax7,'*b','linewidth', 10)
text(X7(1),X7(2), Zmax7+1, 'G', 'fontsize', 50)
%2 часть-------------------------------------------------------------------------------------------------------
Xmass=[X4(1) X5(1) X3(1) X6(1) X2(1) X7(1) X1(1)]
Ymass=[X4(2) X5(2) X3(2) X6(2) X2(2) X7(2) X1(2)]
Zmass=[Zmax4 Zmax5 Zmax3 Zmax6 Zmax2 Zmax7 Zmax1]
syms A B C D E F G
Letters=[D E C F B G A];
syms Xr Yr t
Zr=10*sin(0.9*Yr-0.4*Xr).*sin(1.1*Xr).*sin(0.2*Yr)+15;
figure(1)
kol=0;
syms x y z
for i=1:6
    for j=(i+1):7
        kol=kol+1;
        %Строим дороги
        Xp= Xmass(i)+(Xmass(j)-Xmass(i)).*t;
        Yp=Ymass(i)+(Ymass(j)-Ymass(i)).*t;
        Zpr=subs(subs(Zr, Xr, Xp), Yr, Yp);
        XX=subs(Xp,t, 0:0.01:1);
        YY=subs(Yp,t,0:0.01:1);
        ZZ=subs(Zpr,t,0:0.01:1);
        plot3(XX, YY, ZZ, 'r', 'linewidth', 3);
        %Находим и отмечаем самые низкие точки на дороге        
        funformin=matlabFunction(symfun(Zpr, [t])); 
        MinusZpr=-Zpr;
        funformax=matlabFunction(symfun(MinusZpr, [t]));
        ExtrT2=fminbnd(funformax,0,1);
        ExtrT1=fminbnd(funformin,0,1);
        ExtrX=subs(Xp,t,ExtrT1);
        ExtrY=subs(Yp,t,ExtrT1);
        ExtrZmin=subs(Zpr, t, ExtrT1);
        ExtrZmax=subs(Zpr, t, ExtrT2);
        RaznicaVisot=vpa(ExtrZmax-ExtrZmin, 5);
        MassRazniciVisot(kol,1)=Letters(i);
        MassRazniciVisot(kol,2)=Letters(j);
        MassRazniciVisot(kol,3)=vpa(ExtrZmin, 3);
        MassRazniciVisot(kol,4)=vpa(ExtrZmax, 3);
        plot3(ExtrX,ExtrY,ExtrZmin,'*y','linewidth', 10);
        %Находим и отмечаем самые "крутые точки" на дороге
        cosa=(Xmass(j)-Xmass(i))/norm([Xp, Yp, Zpr]);
        cosb=(Ymass(j)-Ymass(i))/norm([Xp, Yp, Zpr]);
        dfdl=cosa.*(diff(Zpr,t,1)./diff(Xp,t,1))+cosb.*(diff(Zpr,t,1)./diff(Yp,t,1));
        fun1=matlabFunction(symfun(dfdl, [t]));
        Kriv_t=fminbnd(fun1,0,1);
        Kriv_x=vpa(subs(Xp,t,Kriv_t),5);
        Kriv_y=vpa(subs(Yp,t,Kriv_t),5);
        Kriv_z=vpa(subs(Zpr,t,Kriv_t),5);
        figure(2)
        plot(Kriv_x,Kriv_y,'*g');
        figure(1)
        plot3(Kriv_x,Kriv_y,Kriv_z,'*g','linewidth', 10);
        MassKriv(1,:)=[x y z];
        MassKriv(kol+1,:)=[ Kriv_x Kriv_y Kriv_z];
        %Найдём длины дорог
        DiffX=diff(Xp, t, 1);
        FunDiffX=matlabFunction(symfun(DiffX, [t]));
        DiffY=diff(Yp, t, 1);
        FunDiffY=matlabFunction(symfun(DiffY, [t]));
        DiffZ=diff(Zpr, t, 1);
        FunDiffZ=matlabFunction(symfun(DiffZ, [t]));
        FunOfIntegral=matlabFunction(symfun(sqrt(DiffX^2+DiffY^2+DiffZ^2), [t]));
        DlinaPr=vpa(quad(FunOfIntegral,0,1,1e-4),5);
        MassDlin(kol,1)=Letters(i);
        MassDlin(kol,2)=Letters(j);
        MassDlin(kol,3)=DlinaPr;        
    end
end
disp('Длины дорог')
disp(MassDlin)
disp('Крутые точки')
disp(MassKriv)
disp('Разницы высот')
disp(MassRazniciVisot)

Что делает мой код:
Всё что вне цикла - это поиск координат вершин.
В цикле я перебираю все комбинации из двух вершин, строю дорогу между ними в плоскости параллельной оси апликат, нахожу наиболее "крутые" точки и минимальные точки на каждой дороге, нахожу длины каждой дороги. Потом формирую массивы из минимальной и максимальной точки(их апликаты) для каждой дороги, массив с координатами наиболее крутых точек.
В чём возникли трудности:
Затрудняюсь построить наиболее оптимальные дороги от вершине к вершине, оптимальной является дорога, на которой перепад высот минимален. Это значит, что если мы к примеру стоим в одной вершине, то нам надо найти точку на окружности радиусом в шаг построения, где уменьшение или увеличение высоты по сравнению с точкой, в которой мы стоим, минимально. Отдельно строить для каждой дороги не рационально, так как их целых 21 штука, поэтому надо строить в цикле с перебором вершин.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.04.2020, 18:31
Ответы с готовыми решениями:

Оптимальный путь
Помогите, пожалуйста. Описание: Роботу было приказано найти самый долгий путь с точки A до точки B, но ограничили его двумя...

Найти оптимальный путь
Дан текстовый файл, в нём на каждой строке записаны координаты точек на плоскости. Пример: 1 5 3 7 12 35 Нужно найти минимальную...

Подскажите начало. Оптимальный по затратам путь
Можно ехать на такси со скоростью v1 км/ч и оплатой p1 руб / км либо идти пешком со скоростью v2 км / ч бесплатно. Как с наименьшими...

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

Путь с наименьшим сопротивлением
Чёт я не нашёл в учебнике по физике, каким конкретно образом электрический заряд определяет путь, обладающий наименьшим сопротивлением...

Найти методом потенциалов оптимальный путь от пункта 1 к пункту 9
Найти методом потенциалов оптимальный путь от пункта 1 к пункту 9(помогите пожалуйста)!

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

ADOConection: как провести путь к залоченной БД
Вообщем, решил в бд(аксессе) сохранить таблицу "пользователи", которая будет отвечать за логин и пароль, для авторизации в программу... Я...

Кратчайший путь между двумя точками на поверхности
Дано уравнение поверхности z=f(x,y) и две точки на поверхности. Требуется изобразить на одном графике саму поверхность и кратчайший путь от...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
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, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru