Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
akaelwins
1 / 1 / 2
Регистрация: 11.04.2012
Сообщений: 17
#1

Решение нелинейного уравнения - C++

04.05.2012, 18:27. Просмотров 1561. Ответов 17
Метки нет (Все метки)

Добрый вечер, никак не могу понять как реализовать на C++ решение следующего нелинейного уравнения относительно a:

http://www.cyberforum.ru/cgi-bin/latex.cgi?a = \sum_{k=1}^{n}{b}_{k}\sqrt{{c}_{k}{a}^{2} - {d}^{2}}

bk, ck, d - константы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2012, 18:27     Решение нелинейного уравнения
Посмотрите здесь:

Решение нелинейного уравнения методом простых итераций C++
Решение нелинейного уравнения. C++
Решение нелинейного уравнения. Метод хорд и касательных C++
C++ Решение нелинейного уравнения методом итераций в с++
C++ Решение нелинейного уравнения методом итераций
C++ Решение нелинейного уравнения
C++ Решение нелинейного уравнения методом простых итераций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
andy_111
90 / 59 / 2
Регистрация: 03.07.2011
Сообщений: 148
04.05.2012, 19:02     Решение нелинейного уравнения #2
Это же функция, а не уравнение. Или я что-то не понимаю? Как-то так, наверное
C++
1
2
3
4
5
6
7
double f(int n, double c, double b, double d){
   double a = 0;
   for (int k = 0; k < n; k++){
      a += b * sqrt(c * pow(a,2) - pow(d,2))   
   }
   return a;
}
akaelwins
1 / 1 / 2
Регистрация: 11.04.2012
Сообщений: 17
04.05.2012, 20:51  [ТС]     Решение нелинейного уравнения #3
andy_111
Почему же функция? Вроде, нелинейное уравнение относительно "a", "a" ведь ни от чего не зависит, всё остальное известно. Я думал, оно численно решается, вот и пришёл за советом.
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
04.05.2012, 21:01     Решение нелинейного уравнения #4
Цитата Сообщение от andy_111 Посмотреть сообщение
Это же функция, а не уравнение. Или я что-то не понимаю?
ты что-то не понимаешь.

Добавлено через 2 минуты
Цитата Сообщение от akaelwins Посмотреть сообщение
как реализовать на C++ решение следующего нелинейного уравнения
А корни искать на каком-то отрезке или вообще?
akaelwins
1 / 1 / 2
Регистрация: 11.04.2012
Сообщений: 17
04.05.2012, 21:57  [ТС]     Решение нелинейного уравнения #5
Kuzia domovenok,
Никакого отрезка, на котором они могли бы быть, не задано.
zss
Модератор
Эксперт С++
 Аватар для zss
6110 / 5713 / 1849
Регистрация: 18.12.2011
Сообщений: 14,590
Завершенные тесты: 1
04.05.2012, 22:01     Решение нелинейного уравнения #6
Решать рекурентно.
у нас есть зависимость a=f(a).
Берем произвольное a, вычисляем f(a),
подставляем в a и повторяем процесс до достижения
желаемой точности.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,889
Записей в блоге: 17
04.05.2012, 22:12     Решение нелинейного уравнения #7
Самое первое что приходит в голову подбирать значение а, (но для этого надо знать откуда начинать то есть хотя бы одну границу и погрешность вычислений) и проверять неравенство
Код
|a - f(a)| < e,
где e - погрешность.

Добавлено через 2 минуты
Берем произвольное a, вычисляем f(a)
zss,откуда знать в каком направлении от произвольного двигаться дальше?
Полюбому нужно знать границы (отрезок значений), иначе решение может длиться бесконечность
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
04.05.2012, 22:15     Решение нелинейного уравнения #8
Цитата Сообщение от zss Посмотреть сообщение
Решать рекурентно.
у нас есть зависимость a=f(a).
Берем произвольное a, вычисляем f(a),
подставляем в a и повторяем процесс до достижения
желаемой точности.
А разве доказано, что f(a) -это сжимающая функция?

Цитата Сообщение от Avazart Посмотреть сообщение
zss,откуда знать в каком направлении от произвольного двигаться дальше?
Он прав, есть такой метод, но это метод простых итераций, основанный на какой-то теореме о сжимающих функциях. Проблема в том, что на счёт этих функций в этом случае я не уверен.
zss
Модератор
Эксперт С++
 Аватар для zss
6110 / 5713 / 1849
Регистрация: 18.12.2011
Сообщений: 14,590
Завершенные тесты: 1
04.05.2012, 22:22     Решение нелинейного уравнения #9
Методом проб и ошибок, другого варианта нет.
Если процесс будет расходиться, то пробовать другие
начальные значения.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,889
Записей в блоге: 17
04.05.2012, 22:34     Решение нелинейного уравнения #10
Если процесс будет расходиться, то пробовать другие начальные значения.
только возможно придется перебрать всего ничего бесконечность значений
Нужно знать либо природу ф-ции либо границы в которых находятся корни.

Может вы про это
http://ru.wikipedia.org/wiki/Метод_Ньютона
Kuzia domovenok
 Аватар для Kuzia domovenok
1886 / 1741 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
04.05.2012, 22:35     Решение нелинейного уравнения #11
всё-таки попробуй методом итераций решить. Если он не будет сходиться, значит не судьба.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float f(float x){
  float a=0.0;
  for (int k=1; k<=n; k++){a+=...}
}
 
 
x=0; x1=f(x);dx=fabs(x1-x);i=0;
while (dx>epsilon && (i<100)){
x=x1;
x1=f(x);
dx=fabs(x1-x);
i++;
}
if (i==100)cout<<"FAIL";
else cout<<x1;
thick_int
Заблокирован
04.05.2012, 23:03     Решение нелинейного уравнения #12
Думаю, что автор темы не полностью привел условие задачи.
В таком виде, рехнуться можно не только решения искать, но даже ОДЗ, и в таком общем виде никто и никогда такие уравнения не дает. Должны быть еще какие-то условия на коэффициенты. Например, положительность некоторых из них.
Тогда, немного покрутившись и применив классические неравенства типа Коши-Шварца, и использовав стандартные свойства, как то неотрицательность подкоренного выражения, вполне можно определить тот ОТРЕЗОК, на котором могут быть корни данного уравнения, и который подлежит обследованию.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,889
Записей в блоге: 17
04.05.2012, 23:12     Решение нелинейного уравнения #13
О чем и я говорю.
Как я понимаю итерационный метод может только приблизить результат, но не найти его, опять таки нужны пределы
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,889
Записей в блоге: 17
04.05.2012, 23:19     Решение нелинейного уравнения #14
Предлагаю найти производную ф-ции, что бы попробывать методом Ньютона изадать значение n
Миниатюры
Решение нелинейного уравнения  
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,889
Записей в блоге: 17
04.05.2012, 23:39     Решение нелинейного уравнения #15
Вот вычислил и проверил(Matcad) значение производной
Изображения
 
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,889
Записей в блоге: 17
05.05.2012, 04:32     Решение нелинейного уравнения #16
Вот что получилось, детельно правдо не проверял

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <cmath>
#include <iostream>
#include <vector>
#include <iomanip>
#include <algorithm>
using namespace std;
 
double f(int n,double a,double b[],double c[],double d)
 {
 double sum=0;
 for(int k=0;k<n;k++) sum+=  b[k]*sqrt(c[k]*a*a-d*d);
 return a-sum;
 }
//--------------------------------------------------
double dfda(int n,double a,double b[],double c[],double d)
 {
 double sum=0;
 for(int k=0;k<n;k++) sum+= b[k]*c[k]*a/sqrt(c[k]*a*a-d*d);
 return 1-sum;
 }
//--------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
int n=0;
cout<<"n= ";
cin>>n;
double *b= new double[n];
double *c= new double[n];
for(int k=0;k<n;k++)
 {
 cout<<"b"<<k+1<<"= "; cin>>b[k];
 cout<<"c"<<k+1<<"= "; cin>>c[k];
 }
double d;
cout<<"d= "; cin>>d;
double e=10e-15;
//cout<<"e= "; cin>>e;
double minc= *min_element(&c[0],&c[n]);
 
double a=sqrt(d*d/minc)+e;
//cout<<"a= "; cin>>a;
double fa=f(n,a,b,c,d);
const int count=100;
for(int i=0;i<count && fabs(fa)> e ;i++)
 {
 cout<<"f("<<a<<")= "<<setprecision(10)<<f(n,a,b,c,d)<<endl;
 cout<<"df("<<a<<")= "<<setprecision(10)<<dfda(n,a,b,c,d)<<endl;
 
 a= a - f(n,a,b,c,d)/dfda(n,a,b,c,d);
 fa= f(n,a,b,c,d);
 
 cout<<"a["<<i<<"]= "<<setprecision(10)<<a<<"  f("<<a<<")="
                     <<setprecision(10)<<fa<<endl;
 }
cout<<"result: a= "<<a<<endl;
 
delete[] b,c;
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Миниатюры
Решение нелинейного уравнения  
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,889
Записей в блоге: 17
05.05.2012, 04:43     Решение нелинейного уравнения #17
Долго мучался в подборе начального а, так как если неаккуратно его выбрать, то значение заганяется в область где значение ф-ции несуществует (из-за корня из отрицательного числа)и оттуда не выходит + нужно учитывать погрешность вычислений.
Хорошо что под рукой есть MathCad (кстати там походу аналогичным образом производятся вычисления корней)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.05.2012, 18:37     Решение нелинейного уравнения
Еще ссылки по теме:

C++ Решение нелинейного уравнения методом итерации
Найти решение нелинейного уравнения C++
Решение нелинейного уравнения методом перебора C++
C++ Решение нелинейного уравнения методом простой итерации
Решение нелинейного уравнения C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
akaelwins
1 / 1 / 2
Регистрация: 11.04.2012
Сообщений: 17
05.05.2012, 18:37  [ТС]     Решение нелинейного уравнения #18
Всем большое спасибо, особенно вам, Avazart.
В общем, для начального приближения было принято взять решение уравнения для n=2.
Yandex
Объявления
05.05.2012, 18:37     Решение нелинейного уравнения
Ответ Создать тему
Опции темы

Текущее время: 11:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru