Ben C ve C++ programlama biraz yeniyim, ben zaten Ar bu uygulamış ve şimdi C++ o kadar yazmaya çalışıyorum. C++ 1D dalga fonksiyonu kötü çıkışlar (sonlu farklar)
Istd::vector<double>
ve
std::vector<std::vector<double>>
kullanılan ve sadece
h
,
k
göre boyutlandırılır
std::vector<std::vector<double>> u(t.size(),vector<double>(n))
, ve toplam çalışma süresi doldurmak için her seferinde bir satır geçmesi gerekir, çünkü değer geçirilir.
I having çıkış veri dalga eksenini kestiği zaman yanlış gibi görünüyor olmasıdır. Mantıksal olarak neyin yanlış olduğunu anlayamadım ama bir şeyleri gözden kaçırmış olabilirdim, bence, std::vector
'u yanlış kullanıyorum veya tanıyamadığım bazı veri türü çakışmaları var.
#include <iostream>
#include<math.h>
#include<vector>
#include<fstream>
using namespace std;
vector<double> takestep (double h,double k,vector<double> ukm1,vector<double> ukm2){
int n = ukm1.size();
vector<double> uk(n);
uk[0]=0;
uk[n-1]=0;
for(int i = 1; i < (n-1); i++)
{
uk[i] = (pow(k,2)/pow(h,2))*(ukm1[i+1]-2*ukm1[i]+ukm1[i-1])+2*ukm1[i]-ukm2[i];
}
return uk;
}
//-----------------------------------------------------------------
vector<vector<double> > solve1D (double tf, double h, double k, vector<double> ukm1, vector<double> ukm2){
int n = ukm1.size();
vector<double> t((int)tf/k);
for(int i = 0; i<t.size(); i++)
{
t[i] = k*i;
}
vector<vector<double> > u(t.size(),vector<double>(n));
u[0] = ukm1;
u[1] = takestep(k,h,ukm1,ukm2);
for(int i = 2;i<t.size();i++)
{
u[i]= takestep(h,k,u[i-1],u[i-2]);
}
return u;
}
//====================================================================
int main(int argc, char** argv) {
double tf = 12.0;
double k = .005;
double h = .01;
vector<double> x(1.0/h);
for(int i = 1;i<x.size();i++)
{
x[i] = i*h;
}
vector<double> yo(x.size());
yo[0]=0;
yo[x.size()-1]=0;
for(int i = 1;i<yo.size()-1;i++)
{
yo[i] = 0.5*sin(x[i]*M_PI);
}
vector<vector<double> > u = solve1D(tf,k,h,yo,yo);
ofstream myfile;
myfile.open ("Wave1D_output.txt");
for(int i = 0;i<u.size();i++)
{
for(int j = 0;j<yo.size();j++)
{
myfile<< u[i][j]<<"\t";
}
myfile<<"\n";
}
myfile.close();
return 0;
}
My R komut tamamen işlevseldir ve (endeksleri değişti ile hariç) Ben çoğunlukla aynı kodu kullanıyorum:
Belki birilerinin burada benim kodudur ne yapamam görebilirsiniz. Temel fark, vektörlerin ve 2D dizilerin (bildiğiniz gibi) C++ 'da biraz daha karmaşık olmasıdır. Ben denemek ve OpenMP kullanarak bunu yapmak için gidiyorum bu bitirmek, ama bu (muhtemelen) var sonrabaşka bir gün için başka bir soru. Ben boyutunu yazdırıldığı zaman
denemek ve 'takestep amaçlanan işlevini tanımlamak ve fonksiyonunda denklem kırmaya koduna bazı yorumlar ekleyiniz()' anlamak için basit birkaç ilişkiler içine: belirtildiği gibi, ben bazı yorumlar ekledi. Son olarak, değişkenlerinizin isimlerini “i”, “j”, 'k' vb. Yerine anlamlı bir şeye dönüştürmeye çalışın. Bunu yaptıktan sonra, problemleri kendiniz çözmediyseniz, size yardımcı olabiliriz. . – Ziezi
Çözme1D'ye iki kez geçmenin anlamı nedir? Bu, aynı vektörün iki kopyasını elde etmenin alışılmadık bir yolu, ve ikisinden de hiçbir şey yapmıyorsunuz. Ukm1 ve ukm2'yi, alışılagelmiş olan işlevlerde kullanırsınız, ama bir şeyleri kaçırmadıkça olmaz. Sadece aynı vektörün kopyaları olacaklar. Ayrıca, işlenmemiş karakterleri yerine [:: işl. http://www.cplusplus.com/reference/vector/vector/at/ –
İki daha fazla yorum: Eğer Ayrıca 1. o döngü başlatmak beri Hiç x [0] için bir değer elde gibi görünmüyor, Bir vektörün bir çift ile inşa edilmesi tehlikelidir. Derleyiciniz bunun hakkında bir uyarı atmalıdır. Boyutu (1.0/.01 = 100) olan bir vektör oluşturmayı planlıyorsunuz değil mi? Çift gösterim 100'e çok yakın ama 99.999999 ... ise, kesirli kısmı DROP yapacak ve 99 ile bırakacaksınız. Güvende olmanın ucuz bir yolu var (1/h + 0.5), ama ben Bunu nasıl yaptığınızı düşünün. –