![]() |
Помогите плииз с программой для Turbo Pascal
Помогите пожалуйста с программкой для вычисления бесконечной нормы вектора х размерностью n
|
Цитата:
|
если я правильно понял, то норма вектора - это скаляр его длинны.
Вектор в данном случае - одномерный массив чисел. Надо накапливать норму вектора и пересчитывать ее при поступлении нового значения iой размерности. Т.е. сначала одномерное пространство - линия. Двухмерное - если без "заморочек", то декартова плоскость. Трехмерное - сводится к 2х мерному. Т.е. сначала считаем a+b, затем переходим в плоскость (a+b,c) Так и получается, что надо при каждом поступлении новой величины снижать размерность. Можно кстати в одно, двумерной плоскости находиться, не залезая в 3d. |
ВОт формула, [[x]]8=max(i) [x(i)]
8-так обозначила бесконечность [[]]- норма []-модуль тоесть бесконечный предел=максимальному значению x(i) По теории все понятно, а вот с программой у меня напряг( |
Формула ИМХО не верна, но ладно.
По программе - делай цикл до некоторого условия. В цикле делай сравнение по максимальному отклонению от 0. Т.е. максимальный модуль числа. Нарисуй блок, а ее либо я, либо другой участник переведет тебе в программу. |
а как задать это сравнение?
по логике можно с начало сложить первое с первым число, потом первое со вторым, потом первое с третьим, первое с четвертым (при N=4) и выбрать наибольшую сумму (складывать естественно по модулю) Второе слагаемое как раз и будет этим макс числом Но я не знаю как программу написать, да и выполняется ли условие задачи? "для вычисления беск.нормы вектора" и "для нахождения модуля макс. элемента вектора" суть одна и та же, но все таки мне кажется нужно задействовать в программе формулу. int main(void) { /* Initialized data */ static float b[4] = { 1.f,3.f,8.f,6.f }; /* Local variables */ extern float av01r_c(float *, int *); static int n; static float z__; n = 4; z__ = (float)av01r_c(b, &n); printf("\n %12.4e \n", z__); printf("\n %12.4e %12.4e %12.4e %12.4e \n", b[0], b[1], b[2], b[3]); return 0; } /* main */ результат z=8 Вот какая то программа для нахождения бесконечной нормы, только мне этот язык незнаком Цитата:
Хотя сомнения тоже были... |
dasha131, приведенный пример конечно интересен, но не разу не понятен =(
Если брать воон ту формулу с модулем, которая вызывает подозрения, то задача сводится к нахождению максимального числа в потоке. Т.е. первое приравниваем к текущему максимуму, затем в цикле сравниваем текущий текущий максимум с текущим числом. Тут простой if в цикле, без особых заморочек. ---- НО! Лично я бы предложил отказаться от этой формулы, либо заставил студента доказать ее правильность. Я думаю скаляр длинны надо искать именно как скаляр длинны. Пока для простоты и наглядности рассмотрим декартову систему координат. Во что у нас разлагается вектор? Правильно, в более короткие вектора, коллинеарные (параллельные) осям координат. (взять тот же синус с косинусом в окружности единичного радиуса) Синус и косинус, при неком угле 0<n<90 явно меньше единицы(1) Вот теперь внимательно, попробую рассказать (нарисовать к сожалению сейчас не могу, чуть позже) Как нам просчитать сферу? Сфера это 3х мерная фигура. 4х мерные фигуры брать не буду, их рисовать сложно :) Значит вектор задан 3мя параметрами по осям координат. Поступает первая величина x. Скаляр длинны очевидно равен модулю x т.е. |x| Добавляем следующую координату - y. Уже плоскость и нам надо понизить кол-во степеней объекта. т.е. вернуться обратно к линиям. (мудренно по ходу сказал) Проще Есть плоскость, нам надо ее свести к линии. Поступила y. Что у нас получается? Получается прямоугольный треугольник, где по доказанному Пифагором l = sqrt (|x|^2 + |y|^2); Отлично. Поступает координата z, что мы имеем? Берем плоскость l(!) z на ней образуется прямоугольный треугольник, где катетами являются l, z. Раскрывать подстановку я не вижу смысла, вроде бы как все и так понятно. Т.е. сводить к одной, большой, большой формуле не надо. Надо считать скаляр длинны вектора по мере итерационно (по шагам) по мере поступления данных. Далее можно наращивать кол-во изменений размерности 4, 5, 6d и т.д. Все вектора имеют прямой угол друг с другом, просто это в единой картине сложно рисуется :) Решения задачи я вижу двумя способами: Либо нахождение максимальной величины в потоке Либо постепенное накопление нормы вектора (скаляра длинны) |
Нет, тут точно правильная формула, я проверила
А как это сравнение на языке пасхаль записать вы могли бы показать? |
dasha131, Уточни пожалуйста, что вы понимаете под словом норма.
Просто сейчас спросил у к.ф.м.н, зав. каф. Талапов В. В.(замечательная вещь конференция, иногда сидишь рядом с такими людьми, с которыми в другом месте встретиться просто не реально, т.е. мне бы и в голову не пришло, с кем я сижу) и мне доходчиво объяснили, что под словом "норма вектора" может подразумеваться много всего интересного. Тем более, если мы начинаем говорить про норму бесконечного норму вектора. В принципе, в принципе, формула приведенная тобой так же имеет право на существование, но это несколько иное определение нормы вектора. Норм и определения нормы, как выяснилось, так же много. Т.е. можно назвать максимальное значение координаты n мерного пространства нормой вектора. Обрамление условия с тебя. Т.е. блок var, способ получения значений, способ их выдачи и т.д. Vector - одномерный массив данных. Также называемый вектором. Vector[i] - i'тый элемент вектора. Перебор задается в цикле (скорее всего в цикле for). Если задана бесконечность, т.е. массив не "переборный", то текущее вводимое значение. (цикл while) Max - текущее максимальное значение. Изначально приравнивается первому элементу массива, затем сравнивается с остальными. Код:
if vector[i] > max then Код:
L = sqrt (X1^2 + X2^2 + ... + Xi^2+ ... + Xn^2) |
Кое что исправила, сейчас скину
программа работает и выдает модуль максимального элемента. program norma; var n:integer; max:real; i:integer; a: Array [1..10] of real; begin read (n); for i:=1 to n do begin read (a[i]); end; begin for i:=1 to n do begin if (ABS(a[i])>max) then max:=a[i]; end; write(max:4:2); end; end. a: Array [1..10] of real; незнала как обозначить в блоке описания переменных элемент "а", потом нашла в примерах такое её обозначение, звучит как "Переменная а - массив действительных чисел из 10 элементов" а что это означает? что бы поменялось если я поставила там другие значения? |
dasha131, обрамляй код тегом [code] [/code] - #
Цитата:
Отказаться от явного задания n. Прокомментировать код. Операторная скобка позволяет несколько операторов интерпретировать как один. Это необходимо в ряде конструкций, где предусмотрено выполнение оного оператора, а необходимо выполнить несколько. Например конструкция условия, цикла while. Цитата:
Числа внутри скобок обозначают начальное и конечное значение индекса элемента (в последний момент я засомневался, но вроде так, другого тут быть не может) Так же ты можешь задать двух, трех и так далее мерный массив. ЕМНИП они перечисляются через запятую [a1..a2, b1..b2, и т.д.] Можно задать массив массивов, массив объектов и т.п. Ну это чуть позже вы все пройдете и не в этом посте мне обо всем рассказывать :) |
Спасибо большое что помогаете!
Вот я исправила замечания, завтра еще почитаю про "вайл" и попробую переделать под него:) program norma; var n:integer; max:real; i:integer; a: Array [1..500] of real; begin readln (n); for i:=1 to n do begin read (a[i]); end; for i:=1 to n do begin max:= ABS(a[1]); if (ABS(a[i])>max) then max:=a[i]; end; write(max:4:2); end. |
dasha131, опять напутала, что ж такое то. :)
Код:
program norma; Естественно цикл должен как-то заканчиваться. Либо вводом определенного числа, либо через ентер. Т.е. продумай этот момент. |
Что то с while возникли проблемы( даже нето чтобы проблемы, немогу представить как им воспользоваться в данной задаче.
|
Как можно выбрать максимальное значение из бесконечности???
|
Вроде бы так. Проверь.
Код:
var Так же желательно переписать использую конструкцию case <name> of это даст более гибкие возможности для сравнения переменной с чем-либо. ord - возвращает порядковый номер перечисляемого типа. В качестве конечного символа можно использовать например букву, или иной отличный от знака числа и знака разделителя(лей) символ. |
Вобщем вот окончательный вариант программы по моей задачи, большое спасибо за помощь =))
program norma; var n:integer; max:real; i:integer; x:real; begin max:=0; read (n); for i:=1 to n do begin read (a); if (ABS(a)>max) then max:=ABS(a); end; write(max:4:2); end. |
Подскажите пожалуйста как решить задачу в Паскале.
Составить програму для нахождения значений компонентов вектора S={S1,..S6} где каждая расчитывается по формуле: Si=(Aj+Aj+1)/2, j=1,2..12, Aj может быть положительные и отрицательные значения |
Время: 23:19. |
Время: 23:19.
© OSzone.net 2001-