2010-07-18 3 views
1

Можно создать дубликат:
System of linear equations in C++?Программирование системы уравнений?

у меня есть следующие 2 системы уравнений:

Для а, б, в, г:

0 = a * r1_x + b * r1_x * r1_y + c * r1_y + d 
1 = a * r2_x + b * r2_x * r2_y + c * r2_y + d 
0 = a * r3_x + b * r3_x * r3_y + c * r3_y + d 
1 = a * r4_x + b * r4_x * r4_y + c * r4_y + d 

Для e, f, g, h:

0 = e * r1_x + f * r1_x * r1_y + g * r1_y + h 
0 = e * r2_x + f * r2_x * r2_y + g * r2_y + h 
1 = e * r3_x + f * r3_x * r3_y + g * r3_y + h 
1 = e * r4_x + f * r4_x * r4_y + g * r4_y + h 

Я знаю значения r1_x, r1_y, r2_x, r2_y, r3_x, r3_y, r4_x, r4_y, и нужно решить для а, б, в, г в первом, и, E, F , g, h во втором.

Я знаю, как бы я решил их с помощью карандаша и бумаги, но я действительно не уверен, как его программировать. Как я мог решить вышеупомянутые уравнения в C или C++ (или psuedocode).

Thanks

+0

@ShreevatsaR - этот вопрос намного более общий. У этого есть более простые решения. – IVlad

+1

@IVlad: Оба являются именно «системой линейных уравнений», верно? Я не думаю, что здесь есть что-то намного более простое, чем использование общего решателя системных уравнений (что не слишком сложно, BTW). – ShreevatsaR

+0

@ShreevatsaR: Для этой конкретной проблемы правило Крамера может быть быстрее и менее подвержено ошибкам; но я думаю, что использование общего решения линейного уравнения было бы лучше. – jpalecek

ответ

14

Вы можете отобразить его в матричной системе, A x = b, где A является матрица коэффициентов, b вектор решения, и x являются неизвестными. Вы можете либо реализовать гауссово исключение, либо использовать известную библиотеку. Если вы используете LAPACK, вам нужна программа dgesv.

+0

+1 лучший ответ здесь –

+0

не могли бы вы исправить написание Гаусса, помогать впоследствии ;-) –

4

Линейная алгебра и матировка - ваши друзья здесь.

Eigen выглядит как недавняя библиотека линейной алгебры C++. Посмотрите, может ли это вам помочь.

Вот как выглядит ваша система уравнений. Это матрица:

alt text http://www.equationsheet.com/latexrender/pictures/de5b4238674080766b05b44170baef75.gif

Это вектор неизвестных:

alt text http://www.equationsheet.com/latexrender/pictures/92402dd682f5ec7a4e7055b5c955dace.gif

Здесь вектор правая сторона:

alt text http://www.equationsheet.com/latexrender/pictures/506142f0da0bf28e3058eb664d8909ec.gif

You решить эту систему уравнений путем решения

alt text http://www.equationsheet.com/latexrender/pictures/19820cbc1d00c66b7890ef08175810ca.gif

Поскольку ваша матрица является диагональной, это ваше решение.

Вы можете ввести свое линейное уравнение в Wolfram Alpha и получить символическое решение.

Here - решение для одной из ваших систем. Вы можете видеть форму, которую принимает матрица.

+0

Нет времени сейчас. Может быть позже. Это неверно? Это совершенно бесполезно? ОП даже не подозревает о них. – duffymo

+0

, если вы согласитесь, что ОП действительно может решить их с помощью карандаша и бумаги, тогда он их знает. – IVlad

+0

Я ничего не принимаю. OP, приходящий здесь, чтобы задать этот вопрос, говорит о том, что они не знают, что делать дальше. – duffymo

2

Вы можете использовать Gaussian elimination, но это, вероятно, слишком велико, если у вас будет только 4 уравнения с 4 переменными.

Если вы можете решить эту проблему на бумаге, то разрешите ее на бумаге, найдите формулы для a, b, c, d и e, f, g, h, а затем просто подключите их к своей программе.

+0

Как это менее общий или простой вопрос? Ликвидация гусанов также является решением для другого, и стоит использовать даже для 4 переменных (или даже 3 или даже 2), хотя в этом случае он неотличим от множества других алгоритмов :-)). – ShreevatsaR

+0

@IVlad: Я тоже так думал ... но включение их в Mathematica дает ответ более чем на 10 строк для каждой переменной. – Thomas

+0

Полное удаление Гаусса - это не путь. Без поворота он может быть нестабильным. Если это ваша идея улучшенного ответа, вам нужно много узнать о применении линейной алгебры в реальном мире. – duffymo