2012-02-03 3 views
2

넓은 범위의 매개 변수 공간에 대해 비선형 방정식 시스템을 풀어야합니다. FindRoot를 사용하고 있습니다. 초기 시작점에 민감합니다. 수식을 루프 나 테이블에 넣는 대신 손으로, 시행 착오와 플로팅을해야합니다.행렬을 추가하는 Mathematica

그래서 데이터베이스와 매트릭스를 고정 된 수의 열로 만들었지 만 행 수가 가변적이어서 행렬을 만들 때 새로운 결과를 추가 할 수 있습니다. 같은

지금 내가 사용했습니다 뭔가 :

{{{xx, yy}} = {x, y} /. FindRoot[{f1(x,y) == 0,f2(x,y)==0}, {x,a},{y,b}], 
g(xx,yy)} >>> "Attempt1.txt" 

내가 두 변수에 대한 해결 한 후 변수의 변수와도 함수 g (XX, YY)를 저장하고있다.

이것은 나에게 효과가있는 것처럼 보이지만 그 결과는 더 이상 매트릭스가 아니지만 데이터는 텍스트 유형으로 저장됩니다.

필자는 FindRoot를 손으로 해결할 때마다 행을 추가하는 행렬 또는 데이터베이스를 유지할 수 있습니까? 다시 말하지만, 필자는 FindRoot를 시작점에 민감하게 사용하고 있기 때문에 좋은 시작점을 알지 못하므로 수동으로 FindRoot를 수행해야합니다.

덕분에 많은

+1

정말 그냥 반복 호출이기 때문에이 매트릭스 더 이상하지 왜 당신은, 루프를 넣을 수 있습니다 . 이 Put [{{1, 2}, {3,4}}, "tmp.mx"]를 고려하십시오; 다시 가져온 후에 정확히 똑같은 표현식 인 [ "tmp.mx"]'를 얻으십시오. – halirutan

+0

모든 것을 하나의 항목으로 저장합니다. 내가 data = Import [ "temp.mx"]라고 가정하고 나서 dimension [data]를하면, 대답은 1입니다. 나는 정보를 추출하는 방법을 모른다. 데이터 [[1]]을하면 전체 데이터가 출력됩니다. 개인 정보를 추출 할 수 없습니다. data [[1,1]] 할 때 오류가 발생합니다. – user1169757

+0

그래서 For 루프 안에서 {x1, x2, x3, x4, x5, x6, x7, x8, x8, x10} >>> "temp.mx"를 22 번 반복했습니다. 이제 data = Import [ "temp.mx", "Table"]을 수행 한 다음 Dimensions [data]를 수행하면 110이됩니다. 실제로 원하는 것은 10 열 22 행의 행렬이었습니다. 각 행/레코드 당 10 개의 데이터는 5 개의 데이터로 저장되어 총 크기는 5x22 = 110입니다. 예를 들어 data [[1]] = { "{{24258.225756005108,", "0.0001254874133927587", \ "0.10668678000535163"} 등이 있습니다. 어쨌든 data [[i, j]]가 i 번째 레코드의 j 번째 값을 나타내는 깨끗한 10x22 매트릭스에서 데이터를 얻을 수 있습니까? 감사. – user1169757

답변

0

난 당신이 뭘 하려는지 이해 아니에요하지 않는 한,이 다음

results = {}; 
results = Append[Flatten[{{xx, yy} = {x, y} /. FindRoot[{f1(x,y) == 0,f2(x,y)==0}, {x,a},{y,b}],g(xx,yy)}],results]; 

당신은 매트릭스 결과에 줄을 추가 보내려 할 때마다 작동합니다 손으로, 당신은 단지 초기 a와 b 값에 ​​감도의 문제를 해결하기 위해, 그런데

results = Append[Flatten[{{xx, yy} = {x, y} /. FindRoot[{f1(x,y) == 0,f2(x,y)==0}, {x,a},{y,b}],g(xx,yy)}],results]; 

를 입력합니다, 당신은 일 변화, 루프에서 매개 변수 공간을 탐험 할 수 e 매개 변수를 천천히 그리고 매번 새로운 a 및 b 값에 ​​대한 이전 루프 반복에서 x와 y의 해를 사용합니다.

0

Get 대신 Read을 사용하여 원하는 작업을 수행 할 수 있습니다. Get은 한 번에 전체 파일을 읽지 만 Expression, Byte, Number 및 그 이상을 추출 할 수 있습니다. 따라서 파일을 열고 표현식을 읽고 표현식을 읽은 다음 목록에 넣어야합니다.

PutAppend[{{1, 2}, {3, 4}}, "tmp.mx"] 
PutAppend[{{5, 6}, {7, 8}}, "tmp.mx"] 
PutAppend[{{9, 23}, {11, 12}}, "tmp.mx"] 
PutAppend[{{13, 14}, {15, 16}}, "tmp.mx"] 

stream = OpenRead["tmp.mx"]; 
mat = ArrayPad[ 
    NestWhileList[Read[stream, Expression] &, 
    stream = OpenRead["tmp.mx"], # =!= EndOfFile &], -1]; 
Close[stream]; 

이제는 모든 행을 포함하는 목록이 mat에 있습니다. 첫 번째 요소는 OpenRead의 출력을 포함하고 마지막 요소는 EndOfFile을 포함하기 때문에 각 끝에 하나의 요소를 잘라내는 ArrayPad이 필요합니다. 당신이 NestWhileList 같은 기능 구조에 익숙하지 않은 경우 당신이 원하는대로 그것을 이해가 안 Read

stream = OpenRead["tmp.mx"]; 
mat = {}; 
AppendTo[mat, Read[stream, Expression]]; 
AppendTo[mat, Read[stream, Expression]]; 
AppendTo[mat, Read[stream, Expression]]; 
AppendTo[mat, Read[stream, Expression]]; 
Close[stream];