- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 C++ 的新手。所以实际上我会尝试找出每个时间步 (dt=0.00001) 的总力、速度、位置和总时间,并通过求解简单方程保存 myfile1、myfile2、myfile3、myfile4。我面临着找出确切值(value)的问题。当我运行程序时,发现段错误。那么我该如何解决这个问题呢?我附上了下面给出的程序:任何人都可以帮助我吗?
//C++ programming for selection random number
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <ctime>
#include <sstream>
#include <string>
#include <iomanip>
#include <cmath>
//%stifness
double kp=1000;
//%gravitational
double g=-9.81;
double x[10000], y[10000], z[10000];
double Fx[10000],Fy[10000], Fz[10000];
double vx[10000],vy[10000], vz[10000] ;
double ax[10000],ay[10000], az[10000] ;
double force[10000];
const double PI=4.0*atan(1.0);
using namespace std;
int main()
{
srand((unsigned) time(NULL));
//open output file
ofstream myfile1;
myfile1.open("1.dat");
ofstream myfile2;
myfile2.open("2.dat");
ofstream myfile3;
myfile3.open("3.dat");
ofstream myfile4;
myfile4.open("4.dat");
// %particle parameter
double dt=1e-5;
double Ntimestep=1000;
//particle properties
double R=0.003;
double Dens=2600;
int npart=1;
//Particle Creation
double Mass=(Dens*4*PI*(pow(R,3))/3); //m=(4/3)* Dens*Pi*R^3
cout<<"Mass="<< Mass<<endl;
//initial position of the particle
x[0]=0;
y[0] =0.01;
z[0] =0;
// movement of the particle
// Particle initial velocity and forces
Fx[0]=0;
Fy[0]=0;
Fz[0]=0;
vx[0]=0;
vy[0]=-0.5;
vz[0]=0;
force[0]=0;
// Relation between dashport coefficient and coefficient of restitution
double exp=0.9;
double lnexp=0.10536;
double Eta= ((2*sqrt(Mass*kp)*lnexp)/(sqrt(pow(PI,2)+pow(lnexp,2))));
//Time step
int t=0;
for (int i=0;i<Ntimestep;i++)
{
// calculate particle to wall contact force
if (y[i]<R)
{
Fy[i]=(-kp*(y[i]-R))-Eta*vy[i];
}
// Calculate initial acceleration
ay[i]=(Fy[i]/Mass)+g;
//force[i]+=force[1];
force[i+1]=ay[i]*Mass;
//cout<<"Total_Force="<<force<<endl;
// update valocity and displacement/location
vy[i+1]=(vy[i]+(ay[i]*dt));
y[i+1]=y[i]+vy[i]*dt+0.5*ay[i]*pow(dt,2);
Fy[i]=0;
t=t+1;
double time=t*dt;
//...............output/save file..............................
cout<<"Total force="<<force<<endl;
myfile1<<"Total force="<<force<<endl;
cout<<"velocity="<<vy<<endl;
myfile2<<"velocity="<<vy<<endl;
cout<<"location="<<y<<endl;
myfile3<<"location="<<y<<endl;
cout<<"Total time"<<time<<endl;
myfile4<<"Total time="<<time<<endl;
}
//system ("PAUSE");
cin.ignore();
cin.get();
myfile1.close();
myfile2.close();
myfile3.close();
myfile4.close();
return 0;
}
最佳答案
I suppose that your original value for Ntimestep
was 10000
(the dimension of your C-style arrays x
, y
, z
, Fx
, Fy
, Fz
, vx
, vy
, vz
and force
), not the actual 1000
.
对于实际的 Ntimestep = 1000
,我没有看到出现段错误的情况;但是对于 Ntimestep = 10000
,当 i
循环中的 for
为 9999(最后一次迭代)时,在以下说明中
force[i+1]=ay[i]*Mass;
vy[i+1]=(vy[i]+(ay[i]*dt));
y[i+1]=y[i]+vy[i]*dt+0.5*ay[i]*pow(dt,2);
你在 force
、 vy
和 y
的位置 10000 中写入。这很糟糕(你是 C++ 的学习者,但我想你知道你可以读/写一个从 X x[n]
到 0
的 n-1
数组,并且访问在 x[n]
中是越界访问)。
一些建议,排名不分先后
1) 注意缩进;你的代码很难阅读
2) 尽可能避免使用全局变量
3) 尽可能使用常量(如果您使用 C++11/C++14,则尽可能使用 constexpr
);全局常量很好,您可以用它们定义数组大小;例如,您可以定义一个全局常量
const int numSteps = 10000;
和数组定义(我建议在 main()
本地)可以是
double x[numSteps+1], y[numSteps+1], z[numSteps+1];
double Fx[numSteps+1],Fy[numSteps+1], Fz[numSteps+1];
double vx[numSteps+1],vy[numSteps+1], vz[numSteps+1] ;
double ax[numSteps+1],ay[numSteps+1], az[numSteps+1] ;
double force[numSteps+1];
(+1
给数组另一个位置,避免上面的问题)和for
循环可以
for (int i=0;i<numSteps;i++)
4) 考虑假设使用 std::vector<double>
(带有 resize(numSteps+1)
)而不是 C 风格的数组;使用 std::vector
,使用 at()
而不是 [i]
,你会有一个异常,你会立即发现越界错误
4 之二)如果您使用的是 C++11/C++14,std::array<double, numSteps+1>
可能是比 std::vector<double>
更好的解决方案
p.s.:抱歉我的英语不好
关于c++ - 如何以正确的方式解方程并保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36685806/
在我的一门类(class)中,我接到了一项家庭作业,要求我们在谷歌上搜索 Metapost 语言并找到该语言中方程求解功能的用途。 在浏览了 Metapost 用户手册的前十多页后,我发现只有一个原因
你能帮我在 this page 上的谷歌图表上隐藏趋势线上的工具提示(方程)吗? ? 谢谢 以下是我正在使用的图表选项: var options = { title: 'Weight
我正在尝试将 TeXWorks 编辑器配置为使用与 TeXMaker 相同的语法着色。但是,TexWorks 使用正则表达式来指定应该着色的内容。不幸的是,它没有数学的默认设置。 我想匹配 $ 之间的
我刚开始玩 GHCi。我看到列表生成器基本上解决了给定集合中的方程式: Prelude> [x | x [0.01,0.2..2.0] [1.0e-2,0.2,0.39,0.580000000000
是否有可以使用的图形表达式生成器或方程编辑器的 Java 开源实现? 最好有在线演示,或者至少有屏幕截图。 最佳答案 取决于方程的类型。 如果您正在考虑简单的多项式,您可以尝试 Java Expres
我有四个文本输入字段,在用户输入相关值后,我必须进行 JavaScript 计算以将它们全部相加 我使用: var total = Number(value1) + Number(value2) +
为什么这段代码有两个不同的输出(GCC 4.5.1)(我已经评论了重要的行): int main() { bool a = 1; bool b = 1; bool c = 1;
如果标题含糊不清,我深表歉意,但我不知道如何为我的情况命名。我正在为使用 GPS 的 iPhone 编写一个应用程序。在 didUpdateLocations: 方法中,我针对任意大小的变量测试位置的
我正在尝试计算表中学生的 BMI,四舍五入到三位数: +-------+--------+--------+ | fname | weight | height | +-------+--------
我们可以使用 deSolve R 中的常微分方程 (ODE) 包,但是,我找不到解决两个嵌套 ODE 方程的方法,假设` b'(t) = beta - k*b(t); a'(t) = alpha -b
我有一个 boolean 方程,想简化它。帮忙解决一下。 bool needLoad = isA || (!isA && !isB); 之后我使用 if (needLoad){ if (
我很感兴趣,建模工具(在我的例子中是 OpenModelica 和 Dymola - 建模语言 Modelica)如何求解方程组(线性和/或非线性)。这些工具专为求解微分代数方程而设计。我知道一点将微
Julia:当我有绘图时如何找到最佳拟合曲线/方程?我有一个用 map 绘制的图,但我需要找到一个适合它的二次方程? 最佳答案 正如评论中所说,有一个情节在这里并不真正相关;只有数据本身是。您可以使用
我一直在尝试将像 100, 45 这样的输入放入文本框中,并通过单击按钮通过我的方程式运行它,但我不知道该怎么做。单击按钮后,它应该发布答案作为警报。请帮忙。谢谢。 function Rad(a, b
Julia:当我有绘图时如何找到最佳拟合曲线/方程?我有一个用 map 绘制的图,但我需要找到一个适合它的二次方程? 最佳答案 正如评论中所说,有一个情节在这里并不真正相关;只有数据本身是。您可以使用
有人可以向我解释为什么下面的代码会打印字符“u”吗? int p = 9; int q = 5; int r = p - q; double x = p; double y = q; St
我想以某种方式缩短我的 ODE 方程,因为否则代码会变得困惑。我尝试过使用辅助函数,例如这里的 fe() ,但这不起作用。下面的代码只是一个例子,欢迎任何建议!谢谢! # Import the req
我无法创建正确的文件。程序中的方程不会迭代,它只会根据请求的数量写入相同的总和。 for 循环。 #include #include #include #define LEN 256 int m
我有 2 个指向一些 Point 结构的指针。我想计算两点之间的距离(我不需要计算它的根)所以我有这个: w[0]=X[l]; w[1]=X[l+1]; d=m(w[0]->x
我有一个具有 CSV 上传功能的网站,它将 CSV 中的所有内容推送到临时表,然后分成较小的表。 目前,我有一个显示页面,在 HTML 表格中显示所有这些信息。然而,有些部分需要有公式化的表示。换句话
我是一名优秀的程序员,十分优秀!