Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Вычислить выражение (http://forum.oszone.net/showthread.php?t=272934)

p1ka4y777 27-11-2013 22:41 2262781

Вычислить выражение
 
Вложений: 1
Файл 107315
как для данного действительного числа x вычислить это выражение?

mrcnn 28-11-2013 00:48 2262858

Это обычная рекурсия.
Код:

double f(x)
{
return sin(x) + f(sin(x);
}


p1ka4y777 28-11-2013 02:09 2262875

Цитата:

Цитата mrcnn
f »

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

pva 28-11-2013 11:08 2262989

Если я правильно помню мат.анализ, то выражение на картинке - это разложение в ряд резольвенты оператора sin(x).
Код:

R = (A - lambda I)^-1 = (- 1/lambda))(I + A/lambda + A^2/lambda^2 + ...)
степень - это применение оператора к самому себе. Отрицательная - обратный оператор
В нашем случая lambda=1. Но резольвента существует только если оператор отображает в круг радиусом до 1. Будем считать что |sin(x)| < 1.
Тогда:
Код:

  y = -(I + A + A^2 + ....)  -->  -y = ((A - I)^-1) x  ==> (A - I)(-y) = x
где A(x) = sin(x), I(x) = x

используюя свойства синуса sin(-x) = -sin(x), получаем:
Код:

-sin(y) + y = x
т.е. для заданного x нужно решить уравнение x==y-sin(y), в интервале {-1,+1} (не включая границы, иначе определитель оператора A превысит 1). А это уже можно сделать, например, методом Ньютона.

http://alexandr4784.narod.ru/B13/b13_4_46.pdf, стр.188

mrcnn 28-11-2013 16:26 2263175

Цитата:

Цитата p1ka4y777
выражение должно относиться к арифметическому типу или типу перечисления без области видимости
что-то не так... »

Вы пытались скомпилировать и выдалась ошибка? Если вам эту ошибку выдает студия, то там я забыл скобку. return sin(x) + f(sin(x)); Рекурсия в таком виде вызовет срыв стека, поэтому рекурсия, которая бесконечная должна при опр. условии остановиться, то есть это условие нужно добавить. Условие обычно "эпсилон", например 0.00001 (10 в степени -5). pva, а зачем нужны в данном случае линейные операторные уравнения?

pva 28-11-2013 18:03 2263233

Цитата:

Цитата mrcnn
а зачем нужны в данном случае линейные операторные уравнения? »

Перевести постановку из формы с бесконечным вызовом нелинейной функции в форму решения нелинейного уравнения. Имхо выглядит не так страшно. Дело вкуса

mrcnn, в твоём способе от рекурсии можно избавиться, сделать в 1 цикл, если переиспользовать предыдущие вычисленные значения sin(sin(...)). Имхо возле единиц сходиться будет медленней чем решение обратного уравнения.

p1ka4y777 28-11-2013 18:38 2263248

Цитата:

Цитата pva
от рекурсии можно избавиться »

подробнее об этом, если можно
Цитата:

Цитата pva
Имхо выглядит не так страшно »

ну... немного напряжно)

pva 28-11-2013 22:55 2263380

p1ka4y777, делаем замену переменных:
Код:

1. sin(x) = t1
2. sin(t1) = sin(sin(x)) = t2
3. sin(t2) = sin(sin(sin(x))) = t3
4. sin(t3) = sin(sin(sin(sin(x)))) = t4
...

короче чтобы одна переменная всегда содержала вычисленный в прошлый раз sin(...), тогда синус от неё даст следующий вычисленный синус. Принципиально пишу идею, а не код, ибо код элементарно прост.

p1ka4y777 28-11-2013 23:01 2263383

спасибо большое!
условие непонятное... не пойму, когда закончим то?
можно например так сделать?
Код:

for( i = 1; i <= 5; i++ )
{
 sum+=sin(x);
 x=sin(x);
}


pva 29-11-2013 08:55 2263587

можно, но при x=pi будет большая погрешность.
Цитата:

Цитата pva
-sin(y) + y = x »

я что-то неправильно посчитал. Перепутал знак и думал что в исходной формуле x + sin(x) + ...

Хотя если сделать замену t = sin(x), получится то, что надо,
Код:

y - sin(y) == sin(x)

pva 29-11-2013 09:11 2263594

решение будет выглядеть как если если график http://fooplot.com/plot/hkeczk1te8 отразить вокруг оси y=x (поменять y и x местами)


Время: 20:01.

Время: 20:01.
© OSzone.net 2001-