LINUX.ORG.RU

говорите, можно это сделать на C? Хаха!!

 


3

1

надо построить ортонормальный базис из полиномов Эрмита на интервале [0,inf). Ну то есть получить список из N функций, ортогональных относительно <f,g>=int(exp(-t^2)*f(t)*g(t), t=0..inf).

то есть нам надо на N полиномов Эрмита применить метод ортогонализации Грам-Шмидта.

Что это такое?

есть N функций f[1..N]. Из них делаем N функций F[1..N] по такому пути:

F[i]=f[i]-sum(1/(<F[j],F[j]>)*<f[i],F[j]>F[j],j=1..i-1)



Проблема в том, что на императивном ЯП это вообще непонятно как сделать. Если мне кто-то подскажет - я буду рад.

А на функциональном не получается, ибо у maple невменяемый синтаксис, а octave глючит. А учить для этого Хаскель у меня нет времени :(

★★☆☆☆

Последнее исправление: dikiy (всего исправлений: 4)

Си уже не тьюринг-полный язык?

queen3 ★★★★★
()

если бы ты привел всю процедуру, для тех, кто не понял ни слова в твоем условии задачи....

тебе что нужно, чтобы в движке языка Си магически образовался символьный преобразователь матановых формул что ли?...

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)

надо построить ортонормальный базис из полиномов Эрмита

Ты путаешь программистов с преподавателями высшей математики, кажется.

Alve ★★★★★
()

Очень оригинальный и свежий подход к постановке задачи.

dn2010 ★★★★★
()

Как я понял, символьного решения нет? Тогда любой численный метод (да хоть тот же Ньютон) и хоть на баше пиши. (Octave с этим кстати очень хорошо справляется.)

beastie ★★★★★
()

И что? man GSL. Я так из полиномов Цернике делал ортогональные полиномы на кольце. Все несложно. Правда, у тебя условия похлеще, но почитай мануал.

Anon
()

Это вызов знатокам Си!

Ты победил

Я считаю, что на Сишечке это вменяемо реализовать тупо невозможно

Аминь

fang
()
Ответ на: комментарий от beastie

Как я понял, символьного решения нет? Тогда любой численный метод (да хоть тот же Ньютон) и хоть на баше пиши. (Octave с этим кстати очень хорошо справляется.)

в том-то и дело, что есть. Символьно это очень даже просто. Но на maple я ниасилил. Синтаксис какой-то инопланетянский.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от stevejobs

если бы ты привел всю процедуру, для тех, кто не понял ни слова в твоем условии задачи....

поправил.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от Anon

Да, ясен пень, если тебе это надо аналитически, то покупай mapple!

да мне как нибудь надо. maple есть. Я его кое-как заставил это схавать, но он выдает какую-то херню.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от dikiy

там же везде в определении F нужны не функции, а просто подставить результат? Т.е. sqrt(<F[j],F[j]> - это просто число, не зависящее от конкретной символьной записи F[j]? Тогда почему бы в качестве «функций» не использовать указатели на функции? Получится криво, громоздко, но у тебя будут те самые high order/first class functions, не?

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

там же везде в определении F нужны не функции, а просто подставить результат? Т.е. sqrt(<F[j],F[j]> - это просто число, не зависящее от конкретной символьной записи F[j]? Тогда почему бы в качестве функций не использовать указатели на функции? Получится криво, громоздко, но у тебя будут те самые high order/first class functions, не?

дело в том, что F[j] не известны заранее. Они получаются последовательно. И причем каждая следующая зависит от предыдущих. То есть сначала сделали F[1]:=f[1], потом F[2] зависит уже от F[1] и f[2]. А F[3] зависит от F[1], F[2], f[3].

dikiy ★★☆☆☆
() автор топика

Я считаю, что на Сишечке это вменяемо реализовать тупо невозможно.

Ясен пень, т.к. тебе нужна система символьных вычислений. Ну или накостылять свою на коленке.

В данном случае можно взять и наваять структуру, которая будет олицетворять F'ки и хранить указатели на соотв F[j]'е функции. Чтобы вычислить результаты пишешь ещё одну функцию, которая по данной структуре будет считать значение функции (если оно вообще надо).

А если серьёзно, то бери любую удобную систему компьютерной алгебры для такой задачи, а не C или Haskell.

Norgat ★★★★★
()
Ответ на: комментарий от Anon

да мне пофиг как. хоть символьно, хоть численно. На выхлопе мне надо получить матрицу с числами в итоге.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от Norgat

А если серьёзно, то бери любую удобную систему компьютерной алгебры для такой задачи

maple ниасиливает почему-то. или я его ниасиливаю.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от dikiy

я жутко устал, т.ч. способность к мышлению Особо Низка)

если функция зависит от других функций, то эти функции можно передать как ее аргументы.

например, F2 не будет сама по себе, при вычислении будет всегда F2(F1,f2)

но F2 - это получается, что мы состояние (2) захардкодили прямо в название переменной, неприятно. Тут-то бы и пригодился «настоящий» навороченный язык, но...

допустим, my_func_struct {func,context} - это структура, с полями func и массивом параметров context. и func и context - это указатели на функции. Таким образом вся my_func_struct описывает запуск некой функции в контексте других функций

но запустить структуру нельзя, в си можно запустить только функцию. Тогда делаем хелпер call_func(my_func_struct) - нечто что будет вызывать «функции» (параметр func в структуре my_func_struct ), в контексте других функций (передавая элементы массива context как ее аргумент)

получается простенькая реализация high order. Ничего кроме получения результата подстановки (call_func) не умеет, но нам ничего и не надо.

где я ошибся?)

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

func,context - не указатели на функции, а указатели на варианты

variant_func{type,pointer}. type - тип, pointer - указатель на НЕЧТО (зависит от значения type)

если type=«function», то наш самопальный call будет просто запускать ее, если же type==«my_func_struct», то pointer обрабатывается как указатель на новую структуру, и дальше рекурсивно проваливается до тех пор, пока не найдет «листья» дерева с типом function и не выполнит их

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

может, проще за ночь асилить книжку «хаскель для идиотов», чем неделю писать и дебажить эту самопальную эмуляцию?

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

а, если рекурсия будет сильно большая - сорвет стек, так что нужно придумать, как вручную разлинеить вызовы в последовательные вызовы циклов фиксированной глубины, а промежуточные результаты складывать в кучу или на жесткий диск

stevejobs ★★★★☆
()
Ответ на: комментарий от dikiy

Тогда все просто: делай QR-разложение. Матрица Q (точнее — ее квадратная часть) даст тебе ортонормированные полиномы, матрица R — коэффициенты перевода из ортонормированного базиса в неортогональный.

Anon
()
Ответ на: комментарий от Anon

А это идея. Надо будет обдумать. Спс!

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от dikiy

Скорее ты его. Я maple не знаю, но в Wolfram Mathematica твоя задача вроде бы решается легко (но кодить на ночь глядя откровенно лень, может завтра будет время сделать пример).

Norgat ★★★★★
()

«ВОт и выросло поколение...»

Делаем структуру, описывающую полином (просто массив коэффициентов). Делаем функцию, которая умеет делать полином Эрмита нужной степени.

Пишем функцию, которая умеет вычислять произведение полиномов (получается тоже полином).

Пишем функцию, которая умеет вычислять интеграл от exp(-x^2)*x^n (получается чиселка)

Пишем функцию, которая умеет вычислять скалярное произведение полиномов (получается чиселка)

Создаем массив полиномов, и заполняем его в двойном цикле (каждый следующий элемент считается на основе предыдущих). Все.

ЯП значения не имеет, хоть на С, хоть на С++, хоть на бейсике пишите - императивщина она везде императивщина.

AIv ★★★★★
()
Ответ на: комментарий от anonymous

Решай численно и представляй функции массивами значений.

Анонимуса в депутаты!

AIv ★★★★★
()

И чем тебе тут хаскель поможет, если пространство бесконечно-мерное?

Maple или Mathematica.

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 2)

А, вспомнил, что такое многочлены Эрмита. Может быть, можно и на хаскеле, но зачем?

dave ★★★★★
()

на N полиномов Эрмита применить метод ортогонализации Грам-Шмидта.

Один я вижу, что тут в рифму? ))

AF ★★★
()

Сделай на С++.

anonymous
()

Пиши на паскале.

anonymous
()
Ответ на: комментарий от AIv

Пишем функцию, которая умеет вычислять произведение полиномов (получается тоже полином).

Пишем функцию, которая умеет вычислять интеграл от exp(-x^2)*x^n (получается чиселка)

Пишем функцию, которая умеет вычислять скалярное произведение полиномов (получается чиселка)

да. так можно, но это ж писать сколько надо...

Я тут попробовал следуя идее Anon сделать. Правда надо не QR-разложение брать, а диагонализацию Q=S'DS, где S' - транспонированная S.

Но к сожалению уже на N=8 не хватает точности вычисления :(

А мне в общем надо просто посмотреть, будет ли получившаяся матрица от int(exp(-t^2)*A(t)*int(F(t),t=0..x)*int(G(t),t=0..x),x=0..infinity) разреженной (то есть состоящая из нескольких диагоналей), где G и F - первообразные от ортогонализированных уже полиномов, а A(t) некий полином второй степени.

Ну и в качестве основного приза - посчитать оценку ее «кондиционирования». То есть максимально возможное отношение между наибольшим и наименьшим собственным значением. Это можно сделать с помощью теоремы Гершгорина.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от nanoolinux

А что значит

<f, F[j]>F[j]?

я в топике чуть повыше написал, как определяется <f,g>. Это скалярное произведение двух функций. Получается число.

dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от nanoolinux

А что значит F[j] сразу после скобочки? Там какая-то операция?

Это значит, что из

F[j](t)
получаем функцию

<f[i], F[j]>F[j](t)
dikiy ★★☆☆☆
() автор топика
Ответ на: комментарий от Anon

А ты уверен, что при диагонилизации именно ортонормированный базис получишь?

ну да. Как раз матрица S дает мне коеффициенты нужные:

F[i]:=sum(f[i]*s[i,j],j=1..N)

А при QR разложении такого неполучится.

dikiy ★★☆☆☆
() автор топика
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от dikiy

писать чуть чуть больше чем в ФП стиле. Чудес не бывает, если что то нужно ввести в машину, тебе придется это ввести. Зато работать будет быстро;-)

AIv ★★★★★
()

Используй lambda-конструкции из нововведений C++11. Объекты-функции как раз то, что тебе нужно.

Adonai ★★★
()

на императивном ЯП это вообще непонятно как сделать.

Очевидно же:

1. На С пишешь простенький интерпретатор форта.

2. На форте пишешь простенький интерпретатор лиспа.

3. На лиспе пишешь нормальный лисп-компилятор.

4. А в нём твоя задача уже решается элементарно, если ты о ней к тому времени не забудешь.

harm
()
Ответ на: комментарий от harm

Зачем в этой цепочке форт, если есть C? Он был бы нужен, если бы не было ничего, кроме голого железа.

anonymous
()
Ответ на: комментарий от anonymous

Интуитивно:

1. форт проще для лобовой реализации, чем лисп.

2. лисп проще написать на форте, чем на с.

harm
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.