Войти

Показать полную графическую версию : Вычислить выражение


p1ka4y777
27-11-2013, 22:41
107315
как для данного действительного числа x вычислить это выражение?

mrcnn
28-11-2013, 00:48
Это обычная рекурсия.
double f(x)
{
return sin(x) + f(sin(x);
}

p1ka4y777
28-11-2013, 02:09
f »
выражение должно относиться к арифметическому типу или типу перечисления без области видимости
что-то не так...

pva
28-11-2013, 11:08
Если я правильно помню мат.анализ, то выражение на картинке - это разложение в ряд резольвенты оператора 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
выражение должно относиться к арифметическому типу или типу перечисления без области видимости
что-то не так... »
Вы пытались скомпилировать и выдалась ошибка? Если вам эту ошибку выдает студия, то там я забыл скобку. return sin(x) + f(sin(x)); Рекурсия в таком виде вызовет срыв стека, поэтому рекурсия, которая бесконечная должна при опр. условии остановиться, то есть это условие нужно добавить. Условие обычно "эпсилон", например 0.00001 (10 в степени -5). pva, а зачем нужны в данном случае линейные операторные уравнения?

pva
28-11-2013, 18:03
а зачем нужны в данном случае линейные операторные уравнения? »

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

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

p1ka4y777
28-11-2013, 18:38
от рекурсии можно избавиться »
подробнее об этом, если можно
Имхо выглядит не так страшно »
ну... немного напряжно)

pva
28-11-2013, 22:55
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
спасибо большое!
условие непонятное... не пойму, когда закончим то?
можно например так сделать?
for( i = 1; i <= 5; i++ )
{
sum+=sin(x);
x=sin(x);
}

pva
29-11-2013, 08:55
можно, но при x=pi будет большая погрешность.
-sin(y) + y = x »
я что-то неправильно посчитал. Перепутал знак и думал что в исходной формуле x + sin(x) + ...

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

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

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




© OSzone.net 2001-2012