Софтуерно Инженерство
Loading...
+ Нов въпрос
Filkolev avatar Filkolev 4501 Точки

High-School Maths - Lecture and Exercise

Отварям темата основно за обсъждане на задачата за чертаене на кръг, защото е малко по-предизвикателна от предходните. Според мен обаче няма смисъл да се правят отделни теми за тези задачки (изключение е може би последната), затова я слагам като обща за лекцията.

 

Проблем 8.2 - plot_circle()

Ето докъде стигнах с решението на 8-ма задача. Нарочно слагам снимка, а не самото решение, защото смятам, че ще е по-полезно за всички ако обсъждаме подходи и идеи с минимално споделяне на код: https://ibb.co/j5K5bn. Някой ако знае най-кадърния начин да се качи снимка тук да сподели, понеже не помня някога да съм го правил.

Линкът може да изчезне, затова кратко обяснение на резултата от изпълнението на plot_circle(3, 1, 1.5): кръгът е с верни кординати на центъра (3, 1) и правилен радиус (1.5), пропорциите му са правилни визуално, горната и долната половина са с различни цветове (обяснение след малко), а координатните оси са разчленени (т.е. не се пресичат, което е малко грозно).

Решението ми използва написаната в задача 7 функция plot_math_functions(), тъй като окръжността не може да се опише с една функция. По дефиниция функцията съпоставя на всеки аргумент точно една стойност, докато при окръжността се вижда, че за всички стойности на х освен крайните, имаме по две стойности за у. На практика ползвам две функции, които чертаят горната и долната част поотделно, затова са с различни цветове в изходното изображение.

Самите функции могат да се изведат от уравнението на окръжността, което е: (x - x_c)^2 + (y - y_c)^2 = r^2. Коментарът към самата задача е малко подвеждащ, понеже дадената там формула е за окръжност с център в центъра на равнината. При коренуването се получава модулно уравнение; в зависимост от стойността на израза (у - y_c) имаме два случая, които представляват въпросните две функции - y > y_c е горната част на окръжността, а y < y_c е долната.

Допълнително се налага да се уеднаквят пропорциите на координатните оси, защото в противен случай кръгът изглежда като елипса.

Предстои да дооправя нещата (ако мога), въпреки че става дума основно за разкрасяване, което твърде много ми напомня на мъките ми със CSS, та мотивацията ми не е особено висока:

  • Цялата окръжност да е в един цвят
  • Осите да са съединени
  • Да има една нула в центъра, вместо по една за всяка ос (важи и за предходните задачи)

 

Доста ми е интересно дали някой е избрал/намерил различен начин да реши задачата. Видях, че pyplot има вграден Circle, но ползването на функция, която съм написал в рамките на упражнението, ми се стори по-интересно предизвикателство от четенето на малко документация.

0
Math Concepts for Developers 12/04/2018 19:10:05
mariopavlov avatar mariopavlov 4 Точки

Здрасти,

 

нямах време да реша тази задача, вероятно почивните дни ще гледам повече ... но мисля, че е възможно и с една функция. Трябва да я реша и да тествам каква ще е производителността с моята идея но ... 

Та идеята ми е да калкулирам всяка точка по периметъра и да разпечатам резултата.

X = Cx + r * cos(alpha), и съответно sin(alpha) за y.

По този начин имам масив от точки готов за Рендер, обработка или каквото и друго да ми трябва от окръжността. 

 

П.с. Извинявам се ако има грешки мятам решението от телефона ;)

Успех!

1
mariopavlov avatar mariopavlov 4 Точки

Извинявай, че пиша на втори отговор но реших да разделя евентуалното мое решение на задачата с коментар.

Не съм сигурен matplotlib точно как обработва plot-a, но някъде бях мернал, че има събплотове и други глезотийки. Та ако автоматично ти оцветява кръга в два цвята пробвай да подадеш матплот либ променилива между фунцкиите и така ще имаш един обект с един плот ако това е проблема ...

Относно фунцкията за кръг, доколкото разбирам идеята на задачите тук е да си изведем сами решнията, не знам как ще бъде в следващите упражнения, така че надали е правилно да използваме функцията за кръг (тук може би трябва да се намеси лектора ;) ). Това което намираш за по-интересно да решиш една задача сам, от друга страна не е лошо но от опита ми в бранша много рядко ще ти се налага да измислиш нещо. Така че е дооста полезен скил ако се справяш бързо в документациите и нямаш затруднения с разчиртането на документация на различни библиотеки :) Ще ти спести много време ... :Д

Проблема с координатната система, не съм сигурен дали го видях към обясненията на упражненията или го показаха вчера на екрана но някъде имаше нещо по върпоса :) Може да погледнеш клипа от упражнението или самият ноутбук :)
 

0
nikola.aleksandrov avatar nikola.aleksandrov 3 Точки

Здравейте,

Това е първият ми форумен пост и ще ми трябва малко време да свикна с конвенцията и правилата. В момента работя по първото домашно и на втората задача открих грешка във формулата за Биномната Теорема - степенните показатели на х и у на втория член от ляво надясно са разменени. Вместо х на първа степен, трябва да бъде х на "ен минус първа", a у трябва да бъде на първа степен. За справка може да погледнете следната статия - https://en.wikipedia.org/wiki/Binomial_theorem. Понеже не мога да присъствам на лекциите и упражненията не знам, дали вече е обсъдена тази и други грешки. 

Поздрави,

Никола

0
14/04/2018 16:30:05
rumyana.tsoneva avatar rumyana.tsoneva 2 Точки

При все, че е нещо лесно, но се мъча вече много време да намеря конкретния отговор, 

как махнахте двойната 0 при x/y axis origin??

 

0
borislavdr avatar borislavdr 0 Точки

Не е оптимално решение, но работи:

a = ax.get_xticks().tolist()
a[a.index(0)] = ' '
ax.set_xticklabels(a)

Други идеи?

 

0
Krumeto avatar Krumeto 13 Точки

Това изтрива нулата от Х-оста:

xticks = ax.xaxis.get_major_ticks()
xticks[4].set_visible(False)

Ако искаш да не триеш, а да местиш, можеш да пробваш с това (и да поиграш с параметър pad):

ax.tick_params(axis="x",direction="in", pad=-15)

Ако някой има по-елегантни решения, ще е интересно да се видят.

0
14/04/2018 22:48:24
Filkolev avatar Filkolev 4501 Точки

А защо xticks[4].set_visible(False)? Това не предполага ли, че 0 е точно на позиция 4?

Бих предпочел комбинация от двата подхода. Намираме къде се намира 0-та, след което я скриваме със set_visible(False). Малко грубо ми се струва да презаписваме лейбълите.

0
Atanasov.Am avatar Atanasov.Am 1 Точки

Здравейте,

не ми е много ясна 8 задача, какво трябва да се направи? Условието е Use the plotting function you wrote above to plot the inverse trigonometric functions (arcsin, arccos,arctam arccot) и после отдолу има функция за кръг plot_circle()

Аз направих графика на функцията на кръга и после всичките 4 обърнати функции едно по-друго. Вижте този линк

Така ли трябва да се направи задачата?

Също така коя Python функция използвате за аркус котангенс ? В numpy няма такава, аз намерих тази sympy.acot

 

0
Filkolev avatar Filkolev 4501 Точки

Две отделни задачи са - едната е да начертаеш тригонометричните функции, а другата е за кръга. Има и две отделни клекти за целта, но може би объркването идва от факта, че няма подробни обяснения на втората част.

Аз доколкото намерих решения, arccot(x) = arctan(1/x) е коректно и е доста лесно в случая. По различните източници и софтуери има разминавания, за повече инфо може да погледнеш тук и тук. Разликите идват от разглеждането на cot(x) в ралични интервали, в единия случай от 0 до пи, в другия от -пи/2 до пи/2, което води до различни резултати при чертаенето на аркус котангенс.

0
16/04/2018 23:12:44