Re: FindRoot and vector equations
- To: mathgroup at smc.vnet.net
- Subject: [mg36289] Re: FindRoot and vector equations
- From: Robert Knapp <rknapp at wolfram.com>
- Date: Fri, 30 Aug 2002 01:19:14 -0400 (EDT)
- Organization: Wolfram Research, Inc.
- References: <aki1qd$ia7$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
anhjunk wrote: > I need some help with using FindRoot. I want to solve a system of > nonlinear equations numerically. Each equation in the system is an > equation with vector variables. The equations are such that it is > difficult to convert them to equations involving only the components > of the vector variables. > > I have tried the following two possibilities without success. In what > follows I am using a MADE UP EXAMPLE. In this example it is easy to > write the equations in terms of only the components. Furthermore the > correct solution is obvious. But I made up the example for > illustration only. > > ----------------------------Try > 1-------------------------------------------- > > q = {{x[1], y[1]}, {x[2], y[2]}}; > FindRoot[{q[[1]] + q[[2]] Sqrt[q[[2]].q[[2]]] == {0, 0}, > q[[1]] + q[[2]] == {0, 0}}, {q[[1]], {0, 0}}, {q[[2]], {0, 0}}] > > This results in the error message : > > FindRoot::"fddis": Start specification {q[[1]],{0,0}} does not contain > distinct > starting values. > > > ----------------------------Try > 2--------------------------------------------- > > FindRoot[{q[[1]] + q[[2]] Sqrt[q[[2]].q[[2]]] == {0, 0}, > q[[1]] + q[[2]] == {0, 0}}, {x[1], 0}, {x[2], 0}, {y[1], 0}, > {y[2], 0}] > > This results in the error message : > > FindRoot::"frnum": "Function {0.,0.},{0.,0.}} is not a length 4 list > of numbers at {x[1],x[2],y[1],y[2]} = {0., 0., 0., 0.} > > Questions > > 1) How do I fix these two methods ? For the second, you can ... o Make sure the first argument is evaluated (use Evaluate[]) o Get rid of the Equal (==) o Flatten the vectors. In[1]:= q={{x[1],y[1]},{x[2],y[2]}}; FindRoot[Evaluate[ Flatten[{q[[1]]+q[[2]] Sqrt[q[[2]].q[[2]]],q[[1]]+q[[2]]}]],{x[1], 0},{x[2],0},{y[1],0},{y[2],0}] Out[2]= {x[1] -> 0., x[2] -> 0., y[1] -> 0., y[2] -> 0.} For the first, you will have to wait until a future version of Mathematica (this works in a development version now as shown below) which will support vector variables. It will still not support variables with head Part (like q[[1]]), so you can do FindRoot[{q1 + q2 Sqrt[q2.q2], q1 + q2},{q1,{0,0}},{q2,{0,0}}] which returns In[1]:= FindRoot[{q1 + q2 Sqrt[q2.q2], q1 + q2},{q1,{0,0}},{q2,{0,0}}] Out[4]= {q1 -> {0., 0.}, q2 -> {0., 0.}}From In[4]:= Note that the Evaluate[] will no longer be necessary > 2) What do the error messages mean ? FindRoot::"fddis": means FindRoot is looking for numbers as starting values. FindRoot has a syntax which accepts two starting values for using derivative free methods. From the input you gave, it cannot resolve what you are trying to do. FindRoot::"frnum": If FindRoot cannot resolve a list of equalities, it looks for a list of something which evaluates to numbers when the variables take on numerical values. > > Please keep in mind that this example is made up and trivial to solve > without Mathematica. It is being used for illustration purpose only. > > Thanks >