1. Основы Kotlin. Простые функции — Страница 2 — Fandroid.info
Математические функции
В библиотеке Java определено большое количество математических функций, предназначенных для выполнения более сложных операций. Для примера их использования рассмотрим задачу решения квадратного уравнения ax2 + bx + c = 0.
Напомним, что корни квадратного уравнения ищутся по формуле x1,2 = (-b ± √d) / (2a), где d — дискриминант квадратного уравнения — вычисляется как d = b2-4ac. Мы решим эту задачу в упрощённом виде — найти какой-нибудь из двух возможных корней, скажем, тот, в котором в числителе используется знак плюс.
Для начала напишем функцию для расчёта дискриминанта (она ещё пригодится нам в будущем). Для расчёта b2применим уже написанную выше функцию sqr(x: Double)
.
fun discriminant(a: Double, b: Double, c: Double) = sqr(b) - 4 * a * c
В приведённой записи b
является аргументом функции sqr
. Запись вида
называется вызовом функции sqr
. Подчеркнём отличие параметра и аргумента — параметр определяется внутри функции и имеет определённое имя, в данном случае x
, а аргумент передаётся в функцию снаружи и может являться как именем переменной, так и более сложным выражением.
Теперь напишем функцию для поиска корня квадратного уравнения. Для вычисления квадратного корня применим готовую математическую функцию sqrt(x: Double)
из математической библиотеки Котлина.
fun quadraticEquationRoot(a: Double, b: Double, c: Double) = (-b + kotlin.math.sqrt(discriminant(a, b, c))) / (2 * a)
Здесь мы, в свою очередь, используем уже написанную функцию discriminant
для поиска дискриминанта, и выражение discriminant(a, b, c)
, то есть дискриминант уравнения, является аргументом функции sqrt
. Это как раз тот случай, когда аргумент является сложным выражением.
Обратите внимание на нотацию kotlin.math.
перед именем функции sqrt
. Поскольку готовых функций существует очень много, они разбиты на так называемые пакеты и классы внутри пакетов. kotlin.math.sqrt
является полнымименем функции вычисления квадратного корня, а sqrt
— её коротким именем. Из-за неудобства работы с полными именами, чаще используется следующая запись:
// Разрешение использовать короткие имена для ВСЕХ функций из пакета kotlin.math import kotlin.math.* fun quadraticEquationRoot(a: Double, b: Double, c: Double) = (-b + sqrt(discriminant(a, b, c))) / (2 * a)
Здесь import — так называемая директива
Примеры других функций из kotlin.math
:
- abs(x: Int) или abs(x: Double) — модуль;
- sqrt(x: Double) — квадратный корень;
- Double. pow(x: Double) — возведение в степень xy, используется как
x.pow(y)
; - sin(x: Double) — синус, cos(x: Double) — косинус, tan(x: Double) — тангенс, все три функции считают, что
x
задан в радианах; - exp(x: Double) — экспонента ex;
- log(x: Double), log10(x: Double) — соответственно натуральный и десятичный логарифм;
- min(x: Int, y: Int) или min(x: Double, y: Double) — минимум из двух чисел;
- max(x: Int, y: Int) или max(x: Double, y: Double) — максимум из двух чисел.
В том же пакете kotlin.math
определены константы PI = 3.14…
и E = 2.718…
Переменные в функциях
Выше мы рассмотрели примеры с функциями sqr
, discriminant
и sqRoot
, вычисление результата в которых занимало одну строчку кода. Однако, в программировании это скорее редкий случай; гораздо чаще расчёт результата функции предполагает реализацию некоторой последовательности вычислений — алгоритма. Для сохранения результатов промежуточных вычислений программисты придумали переменные.
Рассмотрим, например, задачу вычисления произведения двух корней квадратного уравнения. Напомним, что корни квадратного уравнения вычисляются как (-b+√d)/(2a) и (-b-√d)/(2a) соответственно, где d — дискриминант квадратного уравнения. При вычислении произведения удобно вначале сохранить вычисленный корень из дискриминанта в переменной sd
x1
и x2
и уже потом рассчитать их произведение. На Котлине это записывается следующим образом:fun quadraticRootProduct(a: Double, b: Double, c: Double): Double /* тип обязателен */ { // Тело функции в виде блока val sd = sqrt(discriminant(a, b, c)) val x1 = (-b + sd) / (2 * a) val x2 = (-b - sd) / (2 * a) return x1 * x2 // Результат }
В этом примере тело функции записано в виде блока в фигурных скобках, в противоположность телу в виде выражения — как в функциях sqr
и discriminant
выше. Знак равенства при этом убирается и обязательно указывается тип результата функции. В примере присутствуют три промежуточные переменные — d
, x1
, x2
. Определение промежуточной переменной в Котлине начинается с ключевого слова val (сокращение от value — значение), за которым следует имя переменной и, после знака равенства — её значение. При желании можно также указать тип переменной, например:
// ... val sd: Double = sqrt(discriminant(a, b, c))
Если тип переменной не указан, он определяется автоматически, например, в данном случае он совпадёт с типом результата функции sqrt
.
Блок состоит из так называемых операторов (в примере их четыре), выполняющихся по порядку сверху вниз. Преждечем использовать какую-либо переменную, её следует определить. Например, такая запись привела бы к ошибке:
fun quadraticRootProduct(a: Double, b: Double, c: Double): Double { val x1 = (-b + sd) / (2 * a) // Unresolved reference: sd val x2 = (-b - sd) / (2 * a) // Unresolved reference: sd val sd = sqrt(discriminant(a, b, c)) return x1 * x2 // Результат }
Последний оператор функции, начинающийся с ключевого слова return, определяет значение её результата; returnпереводится с английского как вернуть (результат). Функция quadraticRootProduct
в первую очередь вычислит значение переменной sd
, используя другие функции discriminant
и sqrt
. Затем произойдёт вычисление переменных x1
и x2
и лишь в конце — вычисление результата в операторе return.
Для сравнения, приведём запись той же функции, не использующей переменные:
fun quadraticRootProduct(a: Double, b: Double, c: Double) = ((-b + sqrt(discriminant(a, b, c))) / (2 * a)) * ((-b - sqrt(discriminant(a, b, c))) / (2 * a))
Хотя и записанная в одну строчку, такая функция является гораздо менее понятной, при её написании легко запутаться при расстановке скобок. Кроме того, в ней происходит двухкратное вычисление корня из дискриминанта, чего следует избегать.
Страницы: 1 2 3 4
Анализ адаптивной дискриминантной функции и ранжирование результатов поиска в базе данных МС/МС для улучшенной идентификации пептидов в протеомике дробовика
1. Эберсолд Р., Манн М. Протеомика на основе масс-спектрометрии. Природа. 2003; 422 (6928): 198–207. [PubMed] [Google Scholar]
2. Стин Х., Манн М. Азбука (и XYZ) секвенирования пептидов. Nat Rev Mol Cell Biol. 2004;5(9):699–711. [PubMed] [Google Scholar]
3. Eng JK, McCormack AL, Yates JR. Подход к корреляции тандемных масс-спектральных данных пептидов с аминокислотными последовательностями в базе данных белков. Журнал Американского общества масс-спектрометрии. 1994;5(11):976–989. [PubMed] [Google Scholar]
4. Perkins DN, Pappin DJC, Creasy DM, Cottrell JS. Вероятностная идентификация белков путем поиска в базах данных последовательностей с использованием данных масс-спектрометрии. Электрофорез. 1999;20(18):3551–3567. [PubMed] [Google Scholar]
5. Craig R, Beavis RC. ТАНДЕМ: сопоставление белков с тандемными масс-спектрами. Биоинформатика. 2004;20(9):1466–1467. [PubMed] [Google Scholar]
6. Несвижский А.И., Витек О., Эберсолд Р. Анализ и проверка протеомных данных, полученных с помощью тандемной масс-спектрометрии. Природные методы. 2007;4(10):787–79.7. [PubMed] [Google Scholar]
7. Chalkley RJ, Hansen KC, Baldwin MA. Биоинформатические методы использования масс-спектрометрических данных для протеомных приложений. Биологическая масс-спектрометрия. 2005; Том. 402: 289–312. [PubMed] [Google Scholar]
8. Садыгов Р.Г., Кочиорва Д., Йейтс Дж.Р. Поиск в большой базе данных с использованием тандемных масс-спектров: поиск ответа в конце книги. Природные методы. 2004;1(3):195–202. [PubMed] [Google Scholar]
9. Карр С., Эберсолд Р., Болдуин М., Бурлингейм А., Клаузер К., Несвижский А. Необходимость рекомендаций по публикации данных идентификации пептидов и белков — Рабочая группа по публикации рекомендаций по пептидам и данные идентификации белков. Молекулярная и клеточная протеомика. 2004;3(6):531–533. [PubMed] [Академия Google]
10. Се Х., Гриффин Т.Дж. Компромисс между высокой чувствительностью и повышенным потенциалом для ложноположительных совпадений пептидной последовательности с использованием двумерной линейной ионной ловушки для протеомики на основе тандемной масс-спектрометрии. Дж. Протеом Рез. 2006 [PubMed] [Google Scholar]
11. Келлер А., Несвижский А.И., Колкер Э., Эберсолд Р. Эмпирическая статистическая модель для оценки точности идентификации пептидов с помощью МС/МС и поиска в базе данных. Аналитическая химия. 2002;74(20):5383–5392. [PubMed] [Академия Google]
12. Цой Х, Несвижский АИ. Полуконтролируемая модельная проверка идентификации пептидов в протеомике на основе масс-спектрометрии. Журнал исследований протеома. 2008;7(1):254–265. [PubMed] [Google Scholar]
13. Чой Х., Гош Д., Несвижский А.И. Статистическая проверка идентификаций пептидов в крупномасштабной протеомике с использованием стратегии поиска в базе данных «мишень-приманка» и гибкого моделирования смесей. Журнал исследований протеома. 2008;7(1):286–292. [PubMed] [Академия Google]
14. Калл Л., Кентербери Д.Д., Уэстон Дж., Ноубл В.С., МакКосс М.Дж. Полууправляемое обучение для идентификации пептидов из наборов данных протеомики дробовика. Природные методы. 2007;4(11):923–925. [PubMed] [Google Scholar]
15. Du X, Yang F, Manes NP, Stenoien DL, Monroe ME, Adkins JN, States DJ, Purvine SO, Camp IIDG, Smith RD. Основанная на линейном дискриминантном анализе оценка частоты ложных открытий для идентификации фосфопептидов. Журнал исследований протеома. 2008;7(6):2195–2203. [Бесплатная статья PMC] [PubMed] [Google Scholar]
16. Сирл Б.С., Тернер М., Несвижский А.И. Повышение чувствительности за счет вероятностного объединения результатов нескольких методологий поиска MS/MS. Журнал исследований протеома. 2008;7(1):245–253. [PubMed] [Google Scholar]
17. Мартинес-Бартоломе С., Наварро П., Мартин-Марото Ф., Лопес-Феррер Д., Рамос-Фернандес А., Вильяр М., Гарсия-Руис Дж. П., Васкес Дж. Свойства распределения средних баллов SEQUEST. Молекулярная и клеточная протеомика. 2008;7(6):1135–1145. [PubMed] [Академия Google]
18. Климек Дж., Эддес Дж.С., Хохманн Л., Джексон Дж., Петерсон А., Летарте С., Гафкен П.Р., Кац Дж.Е., Маллик П., Ли Х., Шмидт А. , Оссола Р., Энг Дж.К., Эберсолд Р., Мартин Д.Б. Стандартная база данных белковых смесей: разнообразный набор данных для помощи в создании улучшенных программных инструментов для идентификации пептидов и белков. Журнал исследований протеома. 2008;7(1):96–103. [Бесплатная статья PMC] [PubMed] [Google Scholar]
19. Whiteaker JR, Zhang HD, Eng JK, Fang RH, Piening BD, Feng LC, Lorentzen TD, Schoenherr RM, Keane JF, Holzman T, Fitzgibbon M, Lin CW, Чжан Х., Кук К., Лю Т., Кэмп Д.Г., Андерсон Л., Уоттс Дж., Смит Р.Д., Макинтош М.В., Паулович А.Г. Прямое сравнение методов фракционирования сыворотки. Журнал исследований протеома. 2007;6(2):828–836. [PubMed] [Академия Google]
20. Lopez-Ferrer D, Martinez-Bartolome S, Villar M, Campillos M, Martin-Maroto F, Vazquez J. Статистическая модель для крупномасштабной идентификации пептидов в базах данных по тандемным масс-спектрам с использованием SEQUEST. Аналитическая химия. 2004;76(23):6853–6860. [PubMed] [Google Scholar]
21. Razumovskaya J, Olman V, Xu D, Uberbacher EC, VerBerkmoes NC, Hettich RL, Xu Y. Вычислительный метод оценки надежности идентификации пептидов в тандемном масс-спектрометрическом анализе с SEQUEST. Протеомика. 2004;4(4):961–969. [PubMed] [Google Scholar]
22. Resing KA, Meyer-Arendt K, Mendoza AM, Aveline-Wolf LD, Jonscher KR, Pierce KG, Old WM, Cheung HT, Russell S, Wattawa JL, Goehle GR, Knight RD , Ан НГ. Улучшение воспроизводимости и чувствительности при идентификации белков человека с помощью протеомики дробовика. Аналитическая химия. 2004;76(13):3556–3568. [PubMed] [Google Scholar]
23. Strittmatter EF, Kangas LJ, Petritis K, Mottaz HM, Anderson GA, Shen YF, Jacobs JM, Camp DG, Smith RD. Применение информации о времени удерживания пептида LC в дискриминантной функции для идентификации пептидов с помощью тандемной масс-спектрометрии. Журнал исследований протеома. 2004; 3(4):760–769.. [PubMed] [Google Scholar]
24. Ulintz PJ, Zhu J, Qin ZHS, Andrews PC. Улучшена классификация результатов поиска в базе данных масс-спектрометрии с использованием новых подходов машинного обучения. Молекулярная и клеточная протеомика. 2006;5(3):497–509. [PubMed] [Google Scholar]
25. Андерсон Д.С., Ли В.К., Паян Д.Г., Ноубл В.С. Новый алгоритм для оценки секвенирования пептидов дробовиком в протеомике: классификация машинной поддержкой векторов пептидных спектров MS/MS и оценок SEQUEST. Журнал исследований протеома. 2003;2(2):137–146. [PubMed] [Академия Google]
26. Элиас Дж. Э., Гиги С. П. Стратегия поиска мишени-приманки для повышения уверенности в крупномасштабной идентификации белков с помощью масс-спектрометрии. Природные методы. 2007;4(3):207–214. [PubMed] [Google Scholar]
27. Чой Х, Несвижский А.И. Частота ложных открытий и связанные с ними статистические концепции в протеомике на основе масс-спектрометрии. Журнал исследований протеома. 2008;7(1):47–50. [PubMed] [Google Scholar]
28. Fitzgibbon M, Li QH, McIntosh M. Способы вывода для оценки достоверности идентификации пептидов. Журнал исследований протеома. 2008;7(1):35–39.. [Бесплатная статья PMC] [PubMed] [Google Scholar]
29. Kall L, Storey JD, MacCoss MJ, Noble WS. Апостериорные вероятности ошибок и коэффициенты ложных открытий: две стороны одной медали. Журнал исследований протеома. 2008;7(1):40–44. [PubMed] [Google Scholar]
30. Несвижский А.И., Келлер А., Колкер Э., Эберсолд Р. Статистическая модель для идентификации белков методом тандемной масс-спектрометрии. Аналитическая химия. 2003;75(17):4646–4658. [PubMed] [Google Scholar]
31. Price TS, Lucitt MB, Wu WC, Austin DJ, Pizarro A, Yocum AK, Ian AB, FitzGerald GA, Grosser T. EBP, программа для идентификации белков с использованием множественной тандемной масс-спектрометрии. наборы данных. Молекулярная и клеточная протеомика. 2007;6(3):527–536. [PubMed] [Академия Google]
32. Несвижский А.И., Роос Ф.Ф., Гроссманн Дж., Фогельзанг М., Эддес Дж.С., Груиссем В., Багинский С., Эберсолд Р. Оценка качества динамического спектра и итеративный вычислительный анализ протеомных данных дробовика: на пути к более эффективной идентификации посттрансляционных модификаций , полиморфизмы последовательностей и новые пептиды. Мол клеточная протеомика. 2006;5(4):652–670. [PubMed] [Google Scholar]
33. Prazen B, Nilsson E, Pratt B, Sadilek M, Martin D, Klimek J, Gemmill A, Hohmann L, Jackson J. Калибровка PeptideProphet для конкретных инструментов; Сиэтл, Вашингтон. 54-я конференция ASMS по масс-спектрометрии и смежным темам. 2006 г. [Академия Google]
34. Нигам К., МакКаллум А., Митчелл Т. Классификация текстов с полуконтролем с использованием EM. В: Chapelle O, Zien A, Scholkopf B, редакторы. Полуконтролируемое обучение. Бостон: Пресса Массачусетского технологического института; 2006. [Google Scholar]
35. Fenyo D, Beavis RC. Метод оценки статистической значимости идентификации белков на основе масс-спектрометрии с использованием общих схем подсчета очков. Аналитическая химия. 2003;75(4):768–774. [PubMed] [Google Scholar]
36. Несвижский А.И., Эберсолд Р. Интерпретация протеомных данных дробовика — Проблема вывода белков. Молекулярная и клеточная протеомика. 2005;4(10):1419–1440. [PubMed] [Google Scholar]
37. Olsen JV, de Godoy LMF, Li GQ, Macek B, Mortensen P, Pesch R, Makarov A, Lange O, Horning S, Mann M. Точность определения массы в миллионных долях на орбитальной ловушке масс-спектрометр с помощью шлюзового ввода массы в C-ловушку. Молекулярная и клеточная протеомика. 2005;4(12):2010–2021. [PubMed] [Google Scholar]
38. Olsen JV, Ong SE, Mann M. Трипсин расщепляет исключительно C-конец до остатков аргинина и лизина. Молекулярная и клеточная протеомика. 2004;3(6):608–614. [PubMed] [Академия Google]
39. Пикотти П., Эберсолд Р., Домон Б. Значение протеолитического фона для протеомики дробовика. Молекулярная и клеточная протеомика. 2007;6(9):1589–1598. [PubMed] [Google Scholar]
40. Hoopmann MR, Finney GL, MacCoss MJ. Высокоскоростное сокращение данных, обнаружение признаков и оценка качества спектра МС/МС наборов данных протеомики дробовика с использованием масс-спектрометрии высокого разрешения. Аналитическая химия. 2007;79(15):5620–5632. [Бесплатная статья PMC] [PubMed] [Google Scholar]
41. Mayampurath AM, Jaitly N, Purvine SO, Monroe ME, Auberry KJ, Adkins JN, Smith RD. DeconMSn: программный инструмент для точного определения моноизотопной массы родительского иона для тандемных масс-спектров. Биоинформатика. 2008;24(7):1021–1023. [Бесплатная статья PMC] [PubMed] [Google Scholar]
42. Shin B, Jung HJ, Hyung SW, Kim H, Lee D, Lee C, Yu MH, Lee SW. Постэкспериментальная моноизотопная масс-фильтрация и уточнение (PE-MMR) тандемных масс-спектрометрических данных повышает точность идентификации пептидов в ЖХ/МС/МС. Молекулярная и клеточная протеомика. 2008;7(6):1124–1134. [PubMed] [Академия Google]
43. Зубарев Р., Манн М. О правильном использовании точности масс в протеомике. Молекулярная и клеточная протеомика. 2007;6(3):377–381. [PubMed] [Google Scholar]
44. Bakalarski CE, Haas W, Dephoure NE, Gygi SP. Влияние точности массы, скорости сбора данных и выбора алгоритма поиска на скорость идентификации пептидов в фосфопротеомике. Аналитическая и биоаналитическая химия. 2007;389(5):1409–1419. [PubMed] [Google Scholar]
45. Брош М., Свами С., Хаббард Т., Чоудхари Дж. Сравнение характеристик mascot и X!Tandem для масс-спектрометрии с низкой и высокой точностью и разработка скорректированного порога талисмана. Молекулярная и клеточная протеомика. 2008;7(5):962–970. [Бесплатная статья PMC] [PubMed] [Google Scholar]
46. Haas W, Faherty BK, Gerber SA, Elias JE, Beausoleil SA, Bakalarski CE, Li X, Villen J, Gygi SP. Оптимизация и использование точности измерения массы пептида в протеомике дробовика. Молекулярная и клеточная протеомика. 2006;5(7):1326–1337. [PubMed] [Google Scholar]
47. Rudnick PA, Wang Y, Evans E, Lee CS, Balgley BM. Крупномасштабный анализ результатов MASCOT с использованием порогового значения, основанного на точности массы (MATH), эффективно улучшает интерпретацию данных. Журнал исследований протеома. 2005;4(4):1353–1360. [PubMed] [Академия Google]
48. Chalkley RJ, Baker PR, Huang L, Hansen KC, Allen NP, Rexach M, Burlingame AL. Всесторонний анализ набора данных многомерной жидкостной хроматографии, масс-спектрометрии, полученных на квадрупольной селекции, квадрупольной ячейке столкновений, времяпролетном масс-спектрометре — II. Новые разработки в программе просмотра белков позволяют выполнять надежный и всесторонний автоматический анализ больших наборов данных. Молекулярная и клеточная протеомика. 2005;4(8):1194–1204. [PubMed] [Академия Google]
49. Таннер С., Шу Х.Дж., Франк А., Ван Л.С., Занди Э., Мамби М., Певзнер П.А., Бафна В. InsPecT: идентификация посттранзиально модифицированных пептидов по тандемным масс-спектрам. Аналитическая химия. 2005;77(14):4626–4639. [PubMed] [Google Scholar]
java — Программа для дискриминанта квадратного уравнения
Задавать вопрос
спросил
Если дискриминант равен 0, то корень всего один. Поскольку возвращаемый тип метода всегда один и тот же, вам все равно следует создать новый ComplexNumber[], только размером один, и поместить ComplexNumber с соответствующим набором реальных значений и комплексным компонентом 0,9.0003
Если дискриминант меньше 0, то есть 2 корня, каждый из которых имеет ненулевые комплексные компоненты. Решите для отдельных частей и сохраните их в 2 комплексных числах, которые затем поместите в один массив.
Я сделал следующее. Мне уже было трудно решить вопрос, поэтому я хотел бы, чтобы кто-нибудь сказал мне, где я ошибся, так как программа продолжала показывать ошибку компилятора.
Это JAVA 9Программа 0114!
Любая подсказка поможет. Спасибо за ваше любезное время и помощь.
public static complexNumber[] cocomplexNumbers(double a, double b, double c){ if (a==0&&b==0&&c==0){ //Все значения являются корнями вернуть ноль; } else if (a==0&&b==0){ //нет корней вернуть новый комплексныйЧисло[0]; } иначе если (а==0){ вернуть новое сложноеЧисло[]{-c/b}; / } еще{ двойной дискриминант = b*b-4*a*c; если (дискриминант <0) вернуть новый комплексныйЧисло[0]; иначе, если (дискриминант == 0) вернуть новое сложноеЧисло[]{ (-b + Math.sqrt(дискриминант))/(2*a)}; еще вернуть новый комплексный номер[]{ (-b + Math.sqrt(дискриминант))/(2*a), (-b - Math.sqrt(дискриминант))/(2*a) } } }
- java
- комплексные числа
4
Одна проблема, которую я вижу, связана со следующим:
return new complexNumber[]{ (-b + Math.sqrt(дискриминант))/(2*a)};
результат (-b + Math.